3

ファイルを読み込んでから、そのファイルを ASCII または HEX で hEdit に表示しようとしています。最終的には、ファイル情報に対して他の計算を実行する予定ですが、今はすべてを確認したいだけです。

現在、コードは最初のビット「MZ」を表示していますが、それだけです。どういうわけか、誤って pszFileText 変数を切り捨てています。実行可能ファイル全体をウィンドウで表示できるようにしたいと考えています。

BOOL ReadInEXEFile(HWND hEdit, LPCTSTR pszFileName)
{
HANDLE hFile;
BOOL bSuccess = FALSE;

hFile = CreateFile(pszFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
    OPEN_EXISTING, 0, NULL);
if(hFile != INVALID_HANDLE_VALUE)
{
    DWORD dwFileSize;

    dwFileSize = GetFileSize(hFile, NULL);
    if(dwFileSize != 0xFFFFFFFF)
    {
        LPSTR pszFileText;

        pszFileText = GlobalAlloc(GPTR, dwFileSize + 1);
        if(pszFileText != NULL)
        {
            DWORD dwRead;
            if(ReadFile(hFile, pszFileText, dwFileSize, &dwRead, NULL))
            {
                pszFileText[dwFileSize] = 0; // Add null terminator
                if(SetWindowText(hEdit, pszFileText))
                {
                    bSuccess = TRUE; // It worked!
                }
            }
            GlobalFree(pszFileText);
        }
    }
    CloseHandle(hFile);
}
return bSuccess;

}

4

3 に答える 3

7

EXE ファイルはバイナリですが、未加工のバイナリ データをそのまま表示しようとしていますが、これは機能しません。表示する前にバイナリ データを 16 進数にエンコードする必要があると考えて、正しい軌道に乗っていました。バイナリ データは表示できませんが、16 進数は表示できます。

代わりにこれを試してください:

static const TCHAR Hex[] = TEXT("0123456789ABCDEF");

BOOL ReadInEXEFile(HWND hEdit, LPCTSTR pszFileName) 
{ 
    BOOL bSuccess = FALSE; 

    HANDLE hFile = CreateFile(pszFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); 
    if (hFile != INVALID_HANDLE_VALUE) 
    { 
        DWORD dwFileSize = GetFileSize(hFile, NULL); 
        if (dwFileSize != INVALID_FILE_SIZE)
        { 
            LPTSTR pszFileText = (LPTSTR) LocalAlloc(LMEM_FIXED, ((dwFileSize * 3) + 1) * sizeof(TCHAR)); 
            if (pszFileText != NULL)
            {
                BYTE buffer[1024];
                DWORD dwOffset = 0;
                DWORD dwRead; 

                for (DWORD dwFilePos = 0; dwFilePos < dwFileSize; dwFilePos += dwRead)
                {
                    if (!ReadFile(hFile, buffer, sizeof(buffer), &dwRead, NULL)) 
                    {
                        CloseHandle(hFile);
                        return FALSE;
                    }

                    if (dwRead == 0)
                        break;

                    for (DWORD idx = 0; idx < dwRead; ++idx)
                    {
                        pszFileText[dwOffset++] = Hex[(buffer[idx] & 0xF0) >> 4];
                        pszFileText[dwOffset++] = Hex[buffer[idx] & 0x0F];
                        pszFileText[dwOffset++] = TEXT(' ');
                    }
                }

                pszFileText[dwOffset] = 0; // Add null terminator 

                bSuccess = SetWindowText(hEdit, pszFileText);
                LocalFree(pszFileText);
            } 
        } 

        CloseHandle(hFile); 
    } 

    return bSuccess; 
}
于 2012-07-01T00:42:41.300 に答える
2

2 つの理由:

1) 実行可能ファイルを読み取っている場合、長さを SetWindowText に渡している場合でも、3 番目のバイトはゼロになる可能性が高く、文字列が終了する可能性があります。

2) この行は間違っています: pszFileText[dwFileSize + 1] = 0;. である必要がありますpszFileText[dwFileSize] = 0;。どこか間違った場所にゼロバイトを書き込んでいます。それが何をしているのかわかりません。

于 2012-07-01T00:33:50.240 に答える
1

表示方法は、おそらくデータが NUL で終了する文字列であり、バイナリ データには NUL が埋め込まれているため、最初の NUL までのデータのみを表示します。

自分でそれを印刷し、データの長さを使用して、NUL で終了する C 文字列に依存するのではなく、印刷する量を知る必要があります。

于 2012-07-01T00:30:29.577 に答える