【问题标题】:Load resource as byte array programmaticaly in C++在 C++ 中以编程方式将资源加载为字节数组
【发布时间】:2013-05-13 17:43:01
【问题描述】:
对于 C#,这里有同样的问题:load resource as byte array programmaticaly
所以我有一个资源(只是二进制文件 - 用户数据,并不重要)。我需要获取一个指向表示此资源的字节数组的指针,该怎么做?资源位于 vs2010(win32 控制台项目)的 Resource Files 中。我想我需要使用winapi的FindResource、LoadResource和LockResource函数。
【问题讨论】:
标签:
c++
visual-studio-2010
winapi
【解决方案1】:
要获取资源的字节信息,第一步是使用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);
为了简洁当然省略了错误处理,你应该检查每个调用的返回值。
【解决方案2】:
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);
}
}