c++ - MSVC++ 2013 中的资源

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

我想以 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/

相关文章:

c++ - 如何检查两个十进制数字的乘积是否大于ULONG_MAX?

c++ - 如何制作只能在一个线程上同时执行的功能?

c++ - 这是对类(Class)友情的恰当运用吗?

c++ - size_t vs int 警告

c++ - #include standard files in more than one .cpp, versus #include it in precompiled header 影响可执行文件的大小?

c++ - 在 MFC C++ 中隐藏窗口

c++ - 在 Visual Studio 2013 下编译 SDL 2.0.0/2.0.1 源代码时出现问题

C++ ifstream 类错误

c++ - C++11 是否需要将此 lambda 声明为可变?

visual-studio - TFS 构建通知未显示任何项目