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

mei*_*rsd 17 c++ resources static-libraries visual-studio visual-c++

我有自定义二进制资源(动画游标),它们想要作为资源存储在Visual Studio C++中的静态库中.事实证明,自定义二进制资源不会被:: LoadCursor()加载,也不会被:: FindResource()找到(如果它是自定义资源和静态库).

这个问题 提供了一些解决方法.

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

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

如何链接dll中的资源?

或者只是在静态库中找到二进制文件?问题中的方法非常麻烦.

Lih*_*ihO 35

在"添加资源"对话框中单击"导入",选择"所有文件(.)",以便它允许您导入任何类型的文件,然后只需选择所需的文件.弹出"自定义资源类型"对话框时,在"资源类型"字段中键入RCDATA.

如果你打开.rc文件,你会看到这样的东西:

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

IDR_RCDATA1          RCDATA               "myfile.whatever"
Run Code Online (Sandbox Code Playgroud)

它将使用以下行生成resource.h:

#define IDR_RCDATA1                  101
Run Code Online (Sandbox Code Playgroud)

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

其中pMyBinaryData是指向此可执行文件的第一个字节的指针.有关更多信息,请访问 资源功能

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

使用这样的资源构建项目时,此资源将成为程序的一部分(dll).

  • @DitherSky:不.不再需要了,请查看[FreeResource function]的文档(http://msdn.microsoft.com/en-us/library/windows/desktop/ms648044(v = vs.85).aspx) :*"此函数已过时,仅支持向后兼容16位Windows.对于32位Windows应用程序,不必释放使用LoadResource加载的资源."* (11认同)