【发布时间】:2013-09-26 11:43:05
【问题描述】:
我正在尝试了解自解压 PE 文件的工作原理。有人可以解释为什么我的代码不起作用,或者修复 main() 部分。
#include <iostream>
#include <Windows.h>
using namespace std;
void ExtractResource(const HINSTANCE hInstance, WORD resourceID, const char* outputFilename);
int main()
{
HINSTANCE hInst = GetModuleHandle (0);
ExtractResource(hInst, 101, "101.dll");
ExtractResource(hInst, 102, "102.dll");
ExtractResource(hInst, 103, "103.dll");
ExtractResource(hInst, 104, "104.dll");
cout << "Files are now extracted!";
Sleep(INFINITE);
}
void ExtractResource(const HINSTANCE hInstance, WORD resourceID, const char* outputFilename){
// First find and load the required resource
HRSRC hResource = FindResource(hInstance, MAKEINTRESOURCE(resourceID), "BINARY");
if(hResource==NULL)
return;
HGLOBAL hFileResource = LoadResource(hInstance, hResource);
// Now open and map this to a disk file
LPVOID lpFile = LockResource(hFileResource);
DWORD dwSize = SizeofResource(hInstance, hResource);
// Open the file and filemap
HANDLE hFile = CreateFileA(outputFilename, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_NEW,
FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_READONLY, NULL);
HANDLE hFilemap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, dwSize, NULL);
LPVOID lpBaseAddress = MapViewOfFile(hFilemap, FILE_MAP_WRITE, 0, 0, 0);
// Write the file
CopyMemory(lpBaseAddress, lpFile, dwSize);
// Unmap the file and close the handles
UnmapViewOfFile(lpBaseAddress);
CloseHandle(hFilemap);
CloseHandle(hFile);
}
我在资源中有 4 个 dll 文件,但我无法使用它来提取它们。资源 ID 应该是正确的,我从资源标题中检查了它。
是hInst 的问题还是还有什么问题?我希望有人可以帮助我:) 我刚刚开始学习 C 和 C++,所以请原谅我。
【问题讨论】:
-
定义“不能”。究竟哪个 API 调用因哪个错误而失败?使用调试器找出答案。
-
它构建得很好,但它不会提取资源。我正在使用 VS2012。
-
所以,调试你的程序找出原因。
-
当我尝试调试它时,调试器不会说/做任何事情。似乎它正在工作,但唯一的问题是它并没有真正提取文件。它们应该被提取到同一个文件夹中,但没有任何反应。
-
在调试器下单步执行程序时,检查每个 API 调用的返回值。找出失败的那个。
标签: c++ resources extract hinstance