【问题标题】: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的FindResourceLoadResourceLockResource函数。

【问题讨论】:

标签: c++ visual-studio-2010 winapi


【解决方案1】:

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

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

【讨论】:

  • GetModuleHandle(NULL); // get the handle to the current module - 这不是 API 返回的内容。它返回用于创建进程的模块的句柄。当资源被编译成 DLL 时,这会失败(一种常见的情况,特别是在本地化方面)。 Accessing the current module’s HINSTANCE from a static library 下概述了一种解决方案。
【解决方案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);
        }
    }

【讨论】:

    猜你喜欢
    • 2012-03-18
    • 2020-12-15
    • 1970-01-01
    • 1970-01-01
    • 2015-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多