C++ MSVC中的资源++;2013

C++ MSVC中的资源++;2013,c++,visual-c++,visual-studio-2013,C++,Visual C++,Visual Studio 2013,我想以字符*或向量或文件的形式访问我的资源。我尝试了下面的方法,结果无效。我不明白为什么。第一个参数是我从文档页面获取的最后一个参数。RT_RCDATA似乎是我想要的。IDK为什么我得到空值 HRSRC rc = FindResourceEx(0, RT_RCDATA, MAKEINTRESOURCE(IDR_MyResource), MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL)); 我得到错误1813。我有一个没有DLL的可执行文件。资源位于可执行文件中

我想以
字符*
或向量或文件的形式访问我的资源。我尝试了下面的方法,结果无效。我不明白为什么。第一个参数是我从文档页面获取的最后一个参数。RT_RCDATA似乎是我想要的。IDK为什么我得到空值

HRSRC rc = FindResourceEx(0, RT_RCDATA, MAKEINTRESOURCE(IDR_MyResource), MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL));
我得到错误1813。我有一个没有DLL的可执行文件。资源位于可执行文件中

2件事:

  • MAKEINTRESOURCE(RT\u RCDATA)
    根据文档应该是
    RT\u RCDATA

  • 第一个参数是保存资源的二进制文件(DLL/exe)的句柄,NULL表示可执行文件

    • 回答(我希望)这个问题,这个答案适用于
      FindResource
      ,不过您可以适应
      findresourcex

      FindResource
      的参数是要搜索的模块、id和类型

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

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

      • 第三是资源类型。当您声明自定义资源时,您在资源脚本中为它指定了一个类型(例如,类似于MYRES;Ex:我将XML用于XML文件)。
        type
        参数将该值作为字符串
      因此,在当前流程资源表中查找类型为
      MYDATA
      的id
      myu id
      (取自包含的
      resource.h
      id文件)的自定义资源将是:

      HRSRC hRes = FindResource(NULL, MAKEINTRESOURCE(MY_ID), _T("MYDATA"));
      
      类似地,假设您将DLL的实例句柄保存到
      DllMain
      PROCESS\u ATTACH
      中的某个全局
      ghInst
      ,则从DLL资源表加载相同的资源是:

      HRSRC hRes = FindResource(ghInst, MAKEINTRESOURCE(MY_ID), _T("MYDATA"));
      

      缺少ID

      “忘记”在资源脚本和C/C++代码中包含的.h文件中正确声明用于资源的标识符并不少见,但资源脚本仍然可以编译。如果资源脚本中包含以下内容

      MY_ID MYDATA "filename.bin"
      
      MY_ID
      不是通过宏定义为数字ID并包含在资源脚本中的,这将在输出资源表中“命名”一个名为
      “MY_ID”
      (注意它是一个字符串)的资源。更糟糕的是,如果id定义宏正确地包含在试图加载此内容的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++代码对资源标识符使用相同的宏。它不能只是同一个“名字”。它必须是同一个宏。如果宏对资源编译器不可用,它将使用名称作为字符串,这通常不是您想要的


      祝您好运。

      资源位于哪个二进制文件中?NULL意味着可执行性使用,以理解其failing@MarcoA.:错误1813未找到它。有人建议使用10。我查找了我正在使用的RT_RCDATA及其。。。10IDK怎么了on@acidzombie24.rc文件中的资源类型是什么?。.rc行的格式应为
      ID类型filepath
      。类型的字符串是什么?@WhozCraig:我不确定这是我的rc文件,这是否意味着我应该使用
      MAKEINTRESOURCE(“v2”)
      ?它也不起作用。我仍然得到1813作为我的最后一个错误啊,我做了改变,我仍然得到1813,这是未找到的资源。我只有一个可执行文件,资源就在其中。这是一个控制台应用程序,我不知道如何获取实例,但无论如何,资源是最重要的executable@acidzombie24很高兴这有帮助。我很遗憾地意识到,在当前的文档中,有一系列厌食症患者这样做的例子。具有讽刺意味的是,在很久以前的3.0/3.1/95天,它被更好地放大了。在我发布的3m中,我发现了如何完成代码的其余部分,即访问原始数据和获取资源的大小。这是多么可笑的文档和谷歌已经为这一功能的可怕。我以前有一个win32.hlp文件或类似的文件名。不幸的是,hlp从vistaNote开始就不再工作了。你可以使用
      RT\u RCDATA
      等。如果设置得当,我发现命名资源类型更容易。每一种都有它的好处,但我很少这样做,我选择了脑死亡(对我来说,思考越少越好)。