【问题标题】:FindResource failsFindResource 失败
【发布时间】:2015-08-30 21:23:02
【问题描述】:

我有一段这样的代码

  IDB_PNG1                PNG                     "images\\list-back.png"
  HRSRC hrsrc = FindResource(module, MAKEINTRESOURCE(IDB_PNG1), TEXT("PNG")); 

这很好用,
但我无法使其适用于以下任何变体

  hrsrc = ::FindResource(module, L"images\\list-back.png", L"PNG");
  hrsrc = ::FindResource(module, L"images\\list-back", L"PNG");
  hrsrc = ::FindResource(module, L"list-back.png", L"PNG");
  hrsrc = ::FindResource(module, L"list-back", L"PNG");

GetlastError 返回 0x00000716 图片文件中找不到指定的资源名称。
使用字符串搜索的正确字符串格式/方式是什么?

编辑:将生成 .rc 并包含 .html 和 .png 文件。我希望能够在不重新编译 exe 的情况下找到并加载该文件。我需要能够在 .html 中以某种方式识别 .png 正在使用什么,在 exe 中我将收到该路径/ID,而不是 FindResource 和加载。这个可以吗?

【问题讨论】:

  • 刚刚遇到了类似的问题 - 试图使用 MAKEINTRESOURCE(ID) 查找资源,但这不起作用,但是当更改为 FindResource(TEXT("ID"),..) 时,它奇迹般地工作了。类似于@EFraim 的建议

标签: c++ windows sfx


【解决方案1】:

RCDATA 行中的第一个条目是名称(或 ID)。最后一个条目只是“资源编译器应该使用什么来创建这个条目”——名称不存储在可执行文件中。

FOO  RCDATA  "images\\list-back.png"

...

::FindResource(module, L"FOO", RT_RCDATA);

【讨论】:

  • 不起作用,反正对我也没用,因为我无法获得 IDB_PNG1 字符串或整数。我在资源回调中收到 images\\list-back.png
  • @cprogrammer:使用 RCDATA 就可以了。用于创建资源的文件名未存储在资源表中 - 名称/标识符是。
  • 我仍然必须使用 MAKEINTRESOURCE(FOO),不适用于“FOO”。至少如果资源在 dll 中并且调用在 exe 中。我用PEExplorer查看过,你是对的,路径没有存储在资源表中 - 是一种死路,但我需要找到一种方法来链接.rc中的资源(将生成rc)我可以从 exe 中“找到”该资源(无需重新编译 exe)。
【解决方案2】:

此外,您可以使用字符串 ID 而不是数字 ID 来存储资源,如下所示:

list-back PNG "images\\list-back.png"

那么你确实可以这样做:

hrsrc = ::FindResource(module, L"list-back", L"PNG");

这比 Erik 提供的解决方案效率低,但如果您尝试从静态库访问某些资源,而资源本身会在稍后阶段嵌入到 DLL/EXE 中,则可以更易于管理。 (那么您不必知道数字 ID,只需在模块之间就符号名称达成一致即可)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多