c++ - WriteFile 写入错误

标签 c++ winapi

我正在尝试将文件从资源复制到 %localappdata%。我有这样的东西:

HINSTANCE hInstance = GetModuleHandle(NULL);
HANDLE hFile = INVALID_HANDLE_VALUE;

HRSRC hrsrc = FindResource(hInstance, MAKEINTRESOURCE(MSIE), RT_RCDATA);
HGLOBAL exeRes = LoadResource(hInstance, hrsrc);

DWORD size = SizeofResource(hInstance, hrsrc);

TCHAR szPath[MAX_PATH];
HANDLE hfile;
if(SUCCEEDED(SHGetFolderPath(NULL, CSIDL_LOCAL_APPDATA|CSIDL_FLAG_CREATE, NULL, 0, szPath))) { 
    PathAppend(szPath, TEXT("test.exe")); 
    hFile = CreateFile(szPath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
}

LPVOID exePtr = LockResource(hrsrc);
DWORD exeWritten = 0;

BOOL writeResult = WriteFile(hFile, exePtr, size, &exeWritten, NULL);

cout << GetLastError() << endl;

BOOL closed = CloseHandle(hFile);

system("PAUSE");
return 0;

我能够找到 HRSRC 并使用 SizeofResource() 确认大小就好了。 CreateFile 实际上是创建文件并返回句柄。 GetLastError() 报告没有错误。写入磁盘的字节数完全正确。

然而,输出的 exe 已损坏(此文件的版本与 Windows 版本不兼容...等等)- 它丢失了图标和所有内容。查看原始文件和输出文件 side-by-side在十六进制编辑器中,文件开头似乎有随机数据。

我在这里错过了什么?

最佳答案

您的LockResource 不正确。它应该通过您之前加载的 HGLOBAL exeRes

LockResource(hrsrc);

应该是

LockResource(exeRes);

来自 LockResource() 上的 MS 文档:

Do not try to lock a resource by using the handle returned by the FindResource or FindResourceEx function. Such a handle points to random data.

附带说明一下,您可能想在使用完后尝试清理已加载和锁定的资源。

关于c++ - WriteFile 写入错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14446784/

相关文章:

c++ - 为什么 std::string 不采用空指针?

c++ - 无法将 char* 与 URLDownloadToFile 一起使用

c++ - 创建最小化重叠窗口 (Win32)

c++ - 如何创建自解压存档(以编程方式)

c++ - 实例化模板函数时出现奇怪的错误

c++ - 如何在不使用 Sleep() 的情况下创建时间计数器?

c++ - 隐藏 MFC 对话框

c++ - 暂时删除互斥句柄

c++ - 重载运算符参数太多,visual studio c++

c++ - 为什么我的球使用加速度作为速度?