gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 22:09:07 66 4
gpt4 key购买 nike

我有自定义二进制资源(动画光标),希望将其作为资源存储在 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, 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) 的一部分。

关于c++ - 如何在 VC++ 静态库中加载自定义二进制资源作为 dll 的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9240188/

66 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com