【问题标题】:FindResource gives error 1813 on exe fileFindResource 在 exe 文件上给出错误 1813
【发布时间】:2013-02-01 06:40:23
【问题描述】:

过去 3 天我一直在尝试这个,但我仍然无法让它工作。 WINAPI FindResource 函数抛出错误 1813:这意味着找不到资源类型。我正在使用 Eclipse,所以没有 .RC 文件或 resource.h 文件,所以我用LoadLibraryA 加载了我的exe 文件,然后在FindResourceA 中使用了HANDLE。这是我的代码:

HRSRC hRsrc;
HMODULE hExe;

/** Loading resource file in the program */
if (!(hExe = LoadLibraryA(TEXT(filename)))) {
    printf("Cannot load resource error: %lu \n", GetLastError());
    return 0;
}
printf("Resource file %s is loaded to the program \n", filename);

/** Finding resource */
if (!(hRsrc = FindResourceA(hExe, MAKEINTRESOURCE(10), "EXE"))) {
    printf("Cannot find resource error: %lu \n", GetLastError());
    return 0;
}
puts("Resource found");

现在,据我了解,MAKEINTRESOURCE(10) 让我们可以定义自定义资源。这是正确的还是我只是弄错了?在资源类型中,我尝试给出“EXE”“BIN”“Exehead”和RT_RCDATA但没有任何效果,它仍然给我和以前一样的错误。网络上的所有解决方案都在Visual Studio 上使用.RCresource.h 文件,有什么可以与eclipse 一起使用的吗?谢谢

【问题讨论】:

    标签: c++ c winapi embedded-resource


    【解决方案1】:

    要从二进制文件中加载特定资源,您需要知道资源的类型及其 ID。

    如果其中一个或两个都不知道,您可以使用函数EnumResourceTypes() 和/或EnumResourceNames() 来查找。

    有关如何使用EnumResourceTypes() 的示例可在此处找到:http://msdn.microsoft.com/en-us/library/windows/desktop/ms648008%28v=vs.85%29.aspx#_win32_Creating_a_Resource_List


    更新:

    如果 MS 提供的资源编辑器不可用,这个 免费 工具可能会有所帮助:http://www.resedit.net/ 我曾经使用过它并可以满足我的需要。反正我不知道它现在的状态。

    【讨论】:

    • @KeshavNair:您可能还想看看我更新中提到的工具。
    【解决方案2】:

    错误是正确的。您的文件中没有 "EXE" 类型的资源。当您说您没有.RC 文件时,您自己也是这么说的。资源是在.RC 文件中定义的,如果你没有,那么你就没有资源。要添加资源 ID 为 10 的 "EXE" 类型的资源,您需要创建一个 .RC 文件,将其添加到您的项目中,然后说

    10 EXE "somefile"
    

    其中“somefile”是您希望将其内容用作资源数据的某个文件。

    如果您的 IDE 不支持 .RC 文件,那么您将无法通过 IDE 添加资源。您必须以其他方式添加它们,例如通过后处理步骤。

    但关键是您收到错误“找不到资源类型”,因为您没有执行任何操作来创建该类型的资源。你期待什么?

    【讨论】:

    • 对不起,但我想知道是否有其他方法可以添加资源或使其工作,我认为是的,我无法在 Eclipse 中添加 .RC 文件
    • @KeshavNair 但这不是你问的问题。你问,“为什么 FindResource 找不到我的资源?”答案是“因为您从未添加过资源,所以什么也找不到。”如果您的问题实际上是“如何在 Eclipse 中添加资源?”那么你应该问那个问题。
    【解决方案3】:

    (*

    记住:当你开始一个新项目时...... Delphi 将 {$R *.res} 添加到您的 .dpr 文件中,以将它生成的 .res 文件链接到您的应用程序中。 例如。如果您将项目保存为 MyProject.dpr,Delphi 将创建一个文件 MyProject.res,其中包含您在 Delphi 的项目选项中指定的应用程序图标和版本信息。如果没有此 .res 文件,您的 .exe 将没有图标或版本信息,您将获得 1813.[EG.: from GetFileVersionInfoSize( PChar( @sFileName[ 1 ] ), 0); ]

    如果您收到重复资源警告,您的代码中可能还有另一个 {$R} 编译器指令,该指令也链接到 MyProject.res。它可能是 .dpr 文件中的重复 {$R *.res},或另一个 .pas 文件中的 {$R MyProject.res}。 (只需)删除另一个编译器指令,而不是 Delphi 自动生成的那个,您的项目将编译得很好。 *)

    【讨论】:

      猜你喜欢
      • 2013-08-30
      • 1970-01-01
      • 2014-07-17
      • 2013-10-17
      • 1970-01-01
      • 2018-10-15
      • 2018-12-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多