WriteFile写错了

dsp*_*099 0 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;
Run Code Online (Sandbox Code Playgroud)

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

然而输出exe已损坏(此文件的版本与Windows的版本不兼容......等等) - 它丢失了它的图标和一切.在十六进制编辑器中并排查看原始文件和输出文件,它会出现文件开头的随机数据.

我在这里错过了什么?

Who*_*aig 7

你LockResource的不对.它应该传递exeRes您之前加载的HGLOBAL .

LockResource(hrsrc);
Run Code Online (Sandbox Code Playgroud)

应该

LockResource(exeRes);
Run Code Online (Sandbox Code Playgroud)

从LockResource()的MS文档:

不要尝试使用FindResource或FindResourceEx函数返回的句柄来锁定资源.这样的句柄指向随机数据.

作为旁注,您可能希望在使用它时尝试清理加载并锁定的资源.

  • 好眼力.@ dsp_099的教训是你应该总是进行错误检查.这段代码根本没有.如果你这样做了,你就会发现问题所在. (2认同)