MSVC ++ 2013中的资源

时间:2014-09-01 19:35:37

标签: c++ visual-c++ visual-studio-2013

我想以char*或向量或文件格式访问我的资源。我尝试了以下,我得到了null。我不明白为什么。第一个参数是我在文档页面中最后一个参数optional。 RT_RCDATA似乎就是我想要的。 IDK我为什么会变空

HRSRC rc = FindResourceEx(0, RT_RCDATA, MAKEINTRESOURCE(IDR_MyResource), MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL));

我收到错误1813.我有一个没有dll的可执行文件。资源位于可执行文件中

2 个答案:

答案 0 :(得分:4)

回答(我希望)此问题和your prior question here,此答案适用于FindResource,但您可以适应FindResourceEx

FindResource的参数是模块到搜索,id和类型。

  • 第一个是要搜索的资源表的实例句柄。您可以使用NULL作为正在运行的进程,否则这是在DLL中,您需要从DllMain中保存实例句柄,通常是在全局ghInst中,并将其用于搜索目标。

  • 第二个应该是您的资源ID。如果您使用的是来自resource.h标头的宏ID,则必须使用MAKEINTRESOURCE(id)包装ID。否则,它与您用于资源ID的字符串(作为字符串)相同。

  • 第三个是资源类型。当您声明自定义资源时,您在资源脚本中给它一个类型(类似于MYRES;例如:我将XML用于xml文件)。 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表示可执行文件。