我想以 char*
或 vector 或文件的形式访问我的资源。我尝试了下面的方法,但结果为空。我不明白为什么。第一个参数是optional我从文档页面中获取的最后一个。 RT_RCDATA 似乎是我想要的。 IDK 为什么我得到 null
HRSRC rc = FindResourceEx(0, RT_RCDATA, MAKEINTRESOURCE(IDR_MyResource), MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL));
我收到错误 1813。我有一个没有 dll 的可执行文件。资源在可执行文件中
最佳答案
回答(我希望)这个问题和 your prior question here ,这个答案适用于FindResource
,虽然你可以适应FindResourceEx
FindResource
的参数是要搜索的模块、id 和类型。
第一个是要搜索资源表的实例句柄。您可以对正在运行的进程使用
NULL
,否则这是一个 DLL,您需要从 DllMain 中保存实例句柄,通常在全局ghInst
中,并将其用于你的搜索目标。第二个应该是您的资源 ID。如果您使用来自
resource.h
header 的宏 ID,则 ID 必须用MAKEINTRESOURCE(id)
包装。否则它与您用于资源 ID 的字符串相同(作为字符串)。- 第三个是资源类型。当您声明您的自定义资源时,您在您的资源脚本中为它指定了一个类型(类似于 MYRES;例如:例如,我将 XML 用于 xml 文件)。
type
参数是字符串形式的值。
因此,在当前的 MYDATA
类型中找到 id MY_ID
的自定义资源(取自包含的 resource.h
id 文件)进程资源表将是:
HRSRC hRes = FindResource(NULL, MAKEINTRESOURCE(MY_ID), _T("MYDATA"));
类似地,从 DLL 资源表加载相同的资源,假设您将 DLL 的实例句柄保存到 的
,是:PROCESS_ATTACH
中的某个全局 ghInst
DllMain
HRSRC hRes = FindResource(ghInst, MAKEINTRESOURCE(MY_ID), _T("MYDATA"));
缺少 ID
“忘记”在包含在资源脚本和 C/C++ 代码中的 .h 文件中正确声明用于资源的标识符的情况并不少见,但资源脚本将高兴地仍然编译。如果以下内容在您的资源脚本中
MY_ID MYDATA "filename.bin"
和 MY_ID
是未通过宏定义为数字 id 并包含在您的资源脚本中,这将“命名”一个名为 “MY_ID”
(注意它是一个 string)在输出资源表中。更糟糕的是,如果 id-defining-macro 被正确地包含在试图加载这个东西的 C/C++ 代码中,那么:
HRSRC hRes = FindResource(NULL, MAKEINTRESOURCE(MY_ID), _T("MYDATA"));
将编译,因为 C/C++ 代码具有正确可用的 MY_ID
,但生成的 ID 与资源文件中使用的 ID 不相同,后者是字符串名称。因此负载将失败。发生这种情况的一个确定标志是,如果失败:
HRSRC hRes = FindResource(NULL, MAKEINTRESOURCE(MY_ID), _T("MYDATA"));
但这行得通:
HRSRC hRes = FindResource(NULL, _T("MY_ID"), _T("MYDATA"));
如果您发现是这种情况,请确保您的 .rc 文件和您的 C/C++ 代码使用相同的宏作为资源标识符。它不能只是相同的“名称”。它必须是相同的宏。如果宏对资源编译器不可用,它会将名称用作字符串,这通常不是您想要的。
祝你好运。
关于c++ - MSVC++ 2013 中的资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25612025/