我有自定义二进制资源(动画游标),希望将其作为资源存储在Visual Studio C中的静态库中.事实证明,自定义二进制资源将不会被:: LoadCursor()或由:: FindResource()发现,如果它是一个自定义资源和一个静态库.
This question
做一些工作.
遵循其建议,如果将* .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是指向此可执行文件的第一个字节的指针.更多信息请访问
Resource Functions
下面是一个例子,您将如何在磁盘上保存这样的二进制资源:
#include "resource.h" #include <windows.h> #include <fstream> int main(int argc,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)的一部分.