我有自定义二进制资源(动画游标),它们想要作为资源存储在Visual Studio C ++中的静态库中。事实证明,自定义二进制资源不会被:: LoadCursor()加载,也不会被:: FindResource()找到(如果它是自定义资源和静态库)。
This question 给出了一些解决方法。
根据其建议,如果我将* .res文件作为“配置属性 - >链接器 - >附加依赖性”添加到exe,则静态库将能够找到该资源。
但是,如果静态库是dll的一部分,并且我将其作为附加依赖项链接,则无法再次找到它!
如何链接dll中的资源?
或者只是在静态库中找到二进制文件?问题中的方法非常麻烦。
答案 0 :(得分:33)
在“添加资源”对话框中单击“导入”,选择“所有文件(。)”,以便它允许您导入任何类型的文件,然后只需选择所需的文件。弹出“自定义资源类型”对话框时,在“资源类型”字段中键入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, 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)的一部分。
答案 1 :(得分:0)
@LihO答案的问题是:
FindResource的第一个参数是包含资源的模块的ModuleID。如果将其设置为 NULL ,该函数将在创建的进程(.exe)中搜索,而不是在DLL中搜索。
但是如何使HMODULE插入静态LIB?
编辑:
答案 2 :(得分:0)
如果您通过MFC(和CWinApp)使用dll,则可以从CWinApp获取HMODULE。
extern MyDllApp theApp;
HMODULE module = (HMODULE)theApp.m_hInstance;
HRSRC myResource = ::FindResource(module,
MAKEINTRESOURCE(IDR_FILE_RESOURCE), _T("GROUP_NAME"));
如果您在FindResource中提供NULL
,则应用程序将找不到您的资源。