这里是 C# 的相同问题:load resource as byte array programmaticaly
所以我有一个资源(只是二进制文件 - 用户数据,并不重要)。我需要获取一个指向表示此资源的字节数组的指针,该怎么做?资源位于vs2010(win32 控制台项目)的资源文件中。我想我需要使用FindResource
,LoadResource
和LockResource
winapi 的功能。
这里是 C# 的相同问题:load resource as byte array programmaticaly
所以我有一个资源(只是二进制文件 - 用户数据,并不重要)。我需要获取一个指向表示此资源的字节数组的指针,该怎么做?资源位于vs2010(win32 控制台项目)的资源文件中。我想我需要使用FindResource
,LoadResource
和LockResource
winapi 的功能。
要获取资源的字节信息,第一步是使用FindResource或FindResourceEx获取资源的句柄。然后,使用LoadResource加载资源 。最后,使用LockResource获取数据的地址并从该点访问SizeofResource字节。以下示例说明了该过程:
HMODULE hModule = GetModuleHandle(NULL); // get the handle to the current module (the executable file)
HRSRC hResource = FindResource(hModule, MAKEINTRESOURCE(RESOURCE_ID), RESOURCE_TYPE); // substitute RESOURCE_ID and RESOURCE_TYPE.
HGLOBAL hMemory = LoadResource(hModule, hResource);
DWORD dwSize = SizeofResource(hModule, hResource);
LPVOID lpAddress = LockResource(hMemory);
char *bytes = new char[dwSize];
memcpy(bytes, lpAddress, dwSize);
为简洁起见,当然省略了错误处理,您应该检查每个调用的返回值。
HRSRC src = FindResource(NULL, MAKEINTRESOURCE(IDR_RCDATA1), RT_RCDATA);
if (src != NULL) {
unsigned int myResourceSize = ::SizeofResource(NULL, src);
HGLOBAL myResourceData = LoadResource(NULL, src);
if (myResourceData != NULL) {
void* pMyBinaryData = LockResource(myResourceData);
std::ofstream f("A:\\TestResource.exe", std::ios::out | std::ios::binary);
f.write((char*)pMyBinaryData, myResourceSize);
f.close();
FreeResource(myResourceData);
}
}