Binary ファイルのビューアを作成

Text Editor で表示できない Binary 形式のファイルを16進数と文字形式で表示します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プロジェクトの設定

  1. 新規プロジェクト(Xdump)を作成します。
    [プロジェクト][リソースの追加][Dialog][新規作成]で DialogBoxを作成します。
    ページ先頭の画像を参考にして DialogBox 全体に[ListBox]を配置して下さい。
    表示する文字幅を揃えるために DialogBox のフォントを設定します。
    DialogBox のプロパティから [一般] [フォントボタン] をクリックして [MSゴシック] を選択して下さい。
    Pフォントが設定されていると文字の幅がそろいません。
    プロジェクトと DialogBox の作成方法は タイトルバーに時刻を表示する を参照して下さい。
  2. 次の表に合わせて「キャプションとID」を設定して下さい。
    BOX キャプション ID
    DialogBox ダイアログ IDD_DIALOG1
    ListBox IDC_LIST1
  3. Xdump.cpp のソースファイルをフォルダーに格納して[プロジェクト][既存項目の追加]からプロジェクトに追加します。
    実行テスト用のファイル(TEST.TXT)をフォルダーに格納します。
    テストに使用する TEST.TXT のリストです。
        0000000000000000
        1111111111111111
        2222222222222222
        aaaaaaaaaaaaaaaa
        bbbbbbbbbbbbbbbb
        cccccccccccccccc
        AAAAAAAAAAAAAAAA
        BBBBBBBBBBBBBBBB
        CCCCCCCCCCCCCCCC
        XXX
        
  4. my.lib と my.h をフォルダーに格納してプロジェクトに加えて下さい。
    プロジェクトに追加する方法は BMP Object Class で画像を表示する を参照して下さい。
  5. [デバッグ]を選択してビルドに続いて実行を行います。
    TEXT.TXT を入力してページ先頭の画像が表示されたら完成です。
    Xdump.exe にファイルを直接ドラッグ&ドロップして起動することもできます。

プログラムの説明

DialogBox を使って Text Editor で表示できない Binary 形式のファイルを16進数と文字形式で表示します。
  1. DataFile は My.lib に登録されている DATAFILE Object です。
    DATAFILE Object の詳細は Edit Control で Text Editor を作る を参照して下さい。
    g_buf[2000][16] はデータ入力領域で、ファイルの先頭から最大32KB分のデータを入力します。
    work[80] は編集用の作業領域です。
        #include    <windows.h>
        #include    "my.h"
        #include    "resource.h"
    
        DATAFILE    DataFile;
        char        work[80];
        u_char      g_buf[2000][16];
        
  2. WinMain() 関数です。
    コマンドラインでファイル名が指定されているときは、そのファイルを入力します。
    コマンドラインで指定されていない時は、ファイルオープンダイアログからファイルを指定します。
        int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE, LPSTR lpCmdLine, int)
        {
            if (lpCmdLine!=NULL && *lpCmdLine!='\0')
                   DataFile.ReadData(lpCmdLine, g_buf[0], 32000);
            else   DataFile.OpenReadData(".", g_buf[0], 32000);
            if (DataFile.dwBytes==0)    return FALSE;
            DialogBox(hInst,MAKEINTRESOURCE(IDD_DIALOG1),NULL,(DLGPROC)DlgProc);
            return TRUE;
        }
        
  3. InitDlgProc() で g_buf[2000][16] に入力したデータを編集して ListBox に登録します。
    work[80] が編集領域で先頭からファイルロケーション,16進数,文字の順に編集します。
    制御文字をそのまま表示することはできないので「.」に置き換えています。
        int InitDlgProc(HWND hDlg)
        {   int     cnt,i,j,pos;
    
            cnt= (DataFile.dwBytes+15)/16;
            for(i=0; i<cnt; i++)
            {   wsprintf(work,"%4X  ",i);
                    :
                    :
                SendMessage(GetDlgItem(hDlg,IDC_LIST1),LB_INSERTSTRING,(WPARAM)i,(LPARAM)work);
            }
            SendMessage(GetDlgItem(hDlg,IDC_LIST1),LB_SETCURSEL,0L,0L);
            return cnt;
        }
        

[Next Chapter ↓] Binary Editor の設計

超初心者のプログラム入門(Win32API C++)