0

我正在尝试将文件从资源复制到 %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 的版本不兼容......等等) - 它丢失了它的图标和所有内容。在十六进制编辑器中并排查看原始文件和输出文件,文件开头似乎有随机数据。

我在这里想念什么?

4

1 回答 1

7

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

LockResource(hrsrc);

应该

LockResource(exeRes);

来自LockResource()的 MS 文档:

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

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

于 2013-01-21T20:42:03.910 回答