如何将 VC++ 静态库中的自定义二进制资源作为 dll 的一部分加载?

2024-01-07

我有自定义二进制资源(动画光标),希望将其作为资源存储在 Visual Studio C++ 的静态库中。事实证明,如果自定义二进制资源是自定义资源且位于静态库中,则它不会被 ::LoadCursor() 加载,也不会被 ::FindResource() 找到。

这个问题 https://stackoverflow.com/questions/531502/vc-resources-in-a-static-library提供了一些解决方法。

按照它的建议,如果我将 *.res 文件作为“配置属性->链接器->附加依赖项”添加到 exe,那么静态库将能够找到该资源。

但是,如果静态库是 dll 的一部分,并且我将其作为附加依赖项链接,则不会再找到它!

如何链接 dll 中的资源?

或者只是让二进制文件在静态库中找到?问题中的方法相当麻烦。


在“添加资源”对话框中单击“导入”,选择“所有文件(.)”,这样您就可以导入任何类型的文件,然后只需在那里选择您想要的文件。当弹出“自定义资源类型”对话框时,在“资源类型”字段中输入 RCDATA。

如果打开 .rc 文件,您将看到类似以下内容:

/////////////////////////////////////////////////////////////////////////////
//
// RCDATA
//

IDR_RCDATA1          RCDATA               "myfile.whatever"

它将生成带有以下行的resource.h:

#define IDR_RCDATA1                  101

在代码中,您可以像这样访问它:

#include "resource.h"
#include <windows.h>

int main(int argc, char* argv[])
{
    HRSRC myResource = ::FindResource(NULL, MAKEINTRESOURCE(IDR_RCDATA1), RT_RCDATA);
    HGLOBAL myResourceData = ::LoadResource(NULL, myResource);
    void* pMyBinaryData = ::LockResource(myResourceData);
    return 0;
}

其中 pMyBinaryData 是指向该可执行文件的第一个字节的指针。欲了解更多信息,请访问资源功能 http://msdn.microsoft.com/en-us/library/ff468902(v=vs.85).aspx

下面是如何在磁盘上保存这样的二进制资源的示例:

#include "resource.h"
#include <windows.h>
#include <fstream>

int main(int argc, char* argv[])
{
    HRSRC myResource = ::FindResource(NULL, MAKEINTRESOURCE(IDR_RCDATA1), RT_RCDATA);
    unsigned int myResourceSize = ::SizeofResource(NULL, myResource);
    HGLOBAL myResourceData = ::LoadResource(NULL, myResource);
    void* pMyBinaryData = ::LockResource(myResourceData);

    std::ofstream f("C:\\x.bin", std::ios::out | std::ios::binary);
    f.write((char*)pMyBinaryData, myResourceSize);
    f.close();

    return 0;
}

当您使用此类资源构建项目时,该资源将成为您的程序(dll)的一部分。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 VC++ 静态库中的自定义二进制资源作为 dll 的一部分加载? 的相关文章

随机推荐