我想以char*
或向量或文件格式访问我的资源。我尝试了以下,我得到了null。我不明白为什么。第一个参数是我在文档页面中最后一个参数optional。 RT_RCDATA似乎就是我想要的。 IDK我为什么会变空
HRSRC rc = FindResourceEx(0, RT_RCDATA, MAKEINTRESOURCE(IDR_MyResource), MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL));
我收到错误1813.我有一个没有dll的可执行文件。资源位于可执行文件中
答案 0 :(得分:4)
回答(我希望)此问题和your prior question here,此答案适用于FindResource
,但您可以适应FindResourceEx
FindResource
的参数是模块到搜索,id和类型。
第一个是要搜索的资源表的实例句柄。您可以使用NULL
作为正在运行的进程,否则这是在DLL中,您需要从DllMain中保存实例句柄,通常是在全局ghInst
中,并将其用于搜索目标。
第二个应该是您的资源ID。如果您使用的是来自resource.h
标头的宏ID,则必须使用MAKEINTRESOURCE(id)
包装ID。否则,它与您用于资源ID的字符串(作为字符串)相同。
type
参数是该值作为字符串。因此,在当前进程资源表中查找类型为MY_ID
的id resource.h
(取自包含的MYDATA
id文件)的自定义资源将是:
HRSRC hRes = FindResource(NULL, MAKEINTRESOURCE(MY_ID), _T("MYDATA"));
同样,假设您将DLL的实例句柄保存到ghInst
的{{1}}中的某个全局PROCESS_ATTACH
,从DLL资源表加载相同的资源是:< / p>
DllMain
缺少ID
“忘记”在资源脚本和 C / C ++代码中包含的.h文件中正确声明用于资源的标识符并不罕见,但资源脚本将愉快地仍然编译。如果资源脚本中包含以下内容
HRSRC hRes = FindResource(ghInst, MAKEINTRESOURCE(MY_ID), _T("MYDATA"));
并且MY_ID MYDATA "filename.bin"
不通过宏定义为数字ID并包含在您的资源脚本中,这将“命名”一个名为MY_ID
的资源(请注意其a <输出资源表中的em> string )。更糟糕的是,如果id-defined-macro 正确地包含在试图加载这个东西的C / C ++代码中,那么这个:
"MY_ID"
将编译,因为C / C ++代码已HRSRC hRes = FindResource(NULL, MAKEINTRESOURCE(MY_ID), _T("MYDATA"));
正确可用,但结果ID 不与资源文件中使用的相同,这是一个字符串名称。因此负载将失败。发生这种情况的确切迹象是,如果失败了:
MY_ID
但这有效:
HRSRC hRes = FindResource(NULL, MAKEINTRESOURCE(MY_ID), _T("MYDATA"));
如果您发现这种情况,请确保您的.rc文件和您的C / C ++代码使用相同的宏作为资源标识符。它不能只是相同的“名称”。它必须是相同的宏。如果宏不可用于资源编译器,它将使用该名称作为字符串,通常不你想要的。
祝你好运。
答案 1 :(得分:2)
2件事:
MAKEINTRESOURCE(RT_RCDATA)
应为RT_RCDATA
。
第一个参数是保存资源的二进制文件(DLL / exe)的句柄,NULL表示可执行文件。