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 文件是二进制文件,但您试图按原样显示原始二进制数据,这是行不通的。您在正确的轨道上认为您需要在显示之前将二进制数据编码为十六进制。二进制数据不可显示,但十六进制数据可显示。

试试这个:

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

两个原因:

1) 如果您正在读取可执行文件,则第三个字节可能为零,这可能会终止字符串,即使您将长度传递给 SetWindowText。

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 回答