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のバージョンと互換性がありません...何とか何とか)-アイコンとすべてが失われています。元のファイルと出力ファイルを 16 進エディタで並べて見ると、ファイルの先頭にランダム データがあるように見えます。

ここで何が欠けていますか?

4

1 に答える 1

7

あなたLockResourceは正しくありません。exeRes以前にロードした HGLOBAL を渡す必要があります。

LockResource(hrsrc);

する必要があります

LockResource(exeRes);

LockResource()に関する MS ドキュメントから:

FindResource または FindResourceEx 関数によって返されるハンドルを使用してリソースをロックしようとしないでください。このようなハンドルは、ランダム データを指します。

補足として、ロードおよびロックされたリソースを使い終わったら、そのリソースをクリーンアップしてみてください。

于 2013-01-21T20:42:03.910 に答える