3

这里是 C# 的相同问题:load resource as byte array programmaticaly

所以我有一个资源(只是二进制文件 - 用户数据,并不重要)。我需要获取一个指向表示此资源的字节数组的指针,该怎么做?资源位于vs2010(win32 控制台项目)的资源文件中。我想我需要使用FindResource,LoadResourceLockResourcewinapi 的功能。

4

2 回答 2

9

要获取资源的字节信息,第一步是使用FindResourceFindResourceEx获取资源的句柄。然后,使用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);

为简洁起见,当然省略了错误处理,您应该检查每个调用的返回值。

于 2013-05-13T18:38:53.237 回答
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);
        }
    }
于 2020-03-16T18:30:13.100 回答