如何在VC++静态库中加载自定义二进制资源作为dll的一部分
How to load a custom binary resource in a VC++ static library as part of a dll?
我有自定义的二进制资源(动画游标),它们希望作为资源存储在Visual Studio C++的静态库中。事实证明,如果自定义二进制资源是自定义资源并且在静态库中,则它不会被:LoadCursor()加载,也不会被::FindResource()找到。
这个问题提供了一些解决方案。
根据它的建议,如果我将*.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是指向此可执行文件的第一个字节的指针。欲了解更多信息,请访问资源函数
下面是一个如何在磁盘上保存这样的二进制资源的例子:
#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)的一部分。
@LihO答案的问题是:
FindResource的第一个参数是包含资源的模块的ModuleID。如果设置为NULL,函数将在创建的进程(.exe)中搜索,而不是在DLL中搜索。
但是如何让HMODULE隐含一个静态LIB呢?
- 添加一个函数/参数,该函数/参数将从DLL中获取HMODULE。可以在DLLMain中检索HMODULE/HINSTANCE(相同)
- 尝试此GetCurrentModule
编辑:
另请参阅:将库资源添加到库
如果使用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
,应用程序将找不到您的资源。
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 具有瞬态资源的RAII类
- 有根的二进制搜索树.保留与其父级的链接
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 多态二进制函数
- 正在读取二进制文件(is_open)
- visual在c++中将十进制数转换为二进制数
- C++十进制到二进制,如何转换
- cpp二进制搜索问题,计算给定数组中输入元素的出现次数
- 如何跨平台将二进制资源构建到程序中?
- 在gcc上附加带有资源的二进制文件
- 是否有一种跨平台的方法可以在使用 C++ 编写的二进制应用程序中嵌入资源?
- 在Qt中创建二进制外部资源文件
- 如何使用C 自我提取二进制资源(可执行)
- 外部二进制资源已打开,但QML中不存在
- 如果 qrc 资源被正确编译到二进制文件中,它们会在哪里丢失
- 如何在VC++静态库中加载自定义二进制资源作为dll的一部分
- visual C++自定义二进制资源文件
- 在Visual Studio中向资源中添加二进制文件
- 大型Qt外部二进制资源文件