c - Win32 API - 尝试读取文件时,它被截断了——为什么?

标签 c winapi executable readfile

我正在尝试读取文件,然后将文件以 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;

最佳答案

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; 
}

关于c - Win32 API - 尝试读取文件时,它被截断了——为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11278694/

相关文章:

c - 即使在调用 fclose() 之后,由于 fopen() 而导致的内存泄漏

c++ - 使 CNG 加密 API 在 Windows XP 上工作?

windows - 关于 Win32 ##Event## 同步对象的问题

java - 可执行jar和数据库连接错误

java - 如何将可执行JAR文件打包成EXE

c - Linux 内核模块 copy_to_user 不工作

关于使用指针修改 const 变量的困惑

C - 如何将一对夫妇的第一个数字按升序排列?

node.js - 获取或搜索 npm 中的可执行文件列表

delphi - 如何发现远程桌面 session 的图像质量设置?