2

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

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但没有任何效果,它仍然给我和以前一样的错误。网络上的所有解决方案都带有.RCresource.h文件Visual Studio,有什么可以与 eclipse 一起使用的吗?谢谢

4

3 回答 3

2

要从二进制文件加载特定资源,您需要知道资源的类型及其 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/我曾经使用过它并可以满足我的需要。无论如何,我不知道它的当前状态。

于 2013-02-16T10:49:45.890 回答
2

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

10 EXE "somefile"

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

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

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

于 2013-02-16T13:53:33.527 回答
1

(*

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

If you get a duplicate resource warning, you probably have another {$R} compiler directive elsewhere in your code that also links in MyProject.res. It could be a duplicate {$R *.res} in your .dpr file, or a {$R MyProject.res} in another .pas file. (Just) Delete the other compiler directive instead of the one that Delphi generates automatically, and your project will compile just fine. *)

于 2021-10-12T17:13:35.250 回答