使用Win32 API读取二进制文件

时间:2014-12-15 01:55:22

标签: winapi

我正在尝试读取二进制文件并写入其他位置。

但代码只显示第一位 - " MZ"。根据MSDN," CreateFile和ReadFile  不要使用参数来区分文本和二进制文件类型。"但是我的代码可以正常使用txt文件。

                HANDLE hFile = CreateFile( L"C:\\in.exe", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); 
                if (hFile != INVALID_HANDLE_VALUE) 
                { 
                    char lpBuffer[2000] = "";
                    DWORD dwBytesRead = 0;
                    DWORD dwBytesWritten = 0;

                    HANDLE hTest = CreateFile(L"D:\\out.exe", GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, NULL, NULL);  
                    ReadFile(hFile, lpBuffer, sizeof(lpBuffer), &dwBytesRead, NULL); 
                    WriteFile(hTest, &lpBuffer[0], dwBytesRead, &dwBytesWritten, NULL);

                    CloseHandle(hFile); 
                    CloseHandle(hTest);
                }   

2 个答案:

答案 0 :(得分:0)

当我运行以下代码时,我得到“2000MZÉ0”。

HANDLE hFile = CreateFile(L"C:\\cppConsole.exe",
    GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
if (hFile != INVALID_HANDLE_VALUE)
{
    char lpBuffer[2000] = "";
    DWORD dwBytesRead = 0;
    DWORD dwBytesWritten = 0;
    ReadFile(hFile, lpBuffer, sizeof(lpBuffer), &dwBytesRead, NULL);
    CloseHandle(hFile);
    std::wcout << dwBytesRead << L' ' << lpBuffer << L' ' << (int)lpBuffer[3] << L'\n';
}

请注意,它表示dwBytesRead是2000,换句话说,读取了2000个字节。它说lpBuffer是“MZÉ”的原因是因为它后面有一个空值。因此,如果您将lpBuffer视为字符串,那么您将只获得一部分数据。

答案 1 :(得分:-3)

这很傻......现在我知道为什么了。

                char lpBuffer[2000] = "";

说到二进制文件,缓冲区的大小要大得多。我把2000改为10000,现在它可以了! 尽管lpBuffer只出现在&#34; MZ&#34;,但无论如何都会继续。