Delphi:循环遍历资源文件中的数据

3
我需要在资源文件中循环并加载所有BMP文件,使用以下语句:bBitmap.Handle := LoadBitmap(hInstance, 'IMAGE_NAME'); 如何循环资源文件?我需要进行常规的IO操作并将其视为文本文件吗?我可以读取每一行并创建位图名称列表,然后在单独的循环中执行上述语句以加载位图。或者Delphi库中是否有内置方法来执行此操作?
文件名1 位图 "btnFile1.bmp" 文件名2 位图 "btnFile2.bmp" ....

2
资源是可执行文件内部资源部分中的二进制块。一旦构建可执行文件,就没有“资源文件”,而且它绝对不是文本格式。 “资源文件”是一个预编译的二进制文件,在创建可执行文件时被链接到其中; 资源文件是从文本“资源脚本”中从源代码创建的(除非它由IDE预先创建为二进制文件)。 - Ken White
好的,你可以通过黑客手段将.RC文件作为常量值包含在你的应用程序代码中。然后你的应用程序可以解析该常量,检索所有图像名称并加载它们。类似于 const RC_CONTENTS = '''' {$INCLUDE MYRCFILE.RC} ''''; 但是你可能需要重命名.RC文件才能使其正常工作(否则资源将被包含两次),如果可能的话,你可能会发现引号的正确使用会很麻烦。 - Marjan Venema
1
据我所知,XNResource Editior是开源的Delphi。因此它可以列出资源,你可能会在那里找到一些东西。 - bummi
3
你可以使用WinAPI函数EnumResourceNames,这也是我猜测XNResource Editor用于列出资源的函数(正如@bummi所说)。我手头没有Delphi的示例,而且快速搜索SO/MSDN也没有找到一个。 - Ken White
@TobyAllen:谢谢,但是EnumResourceNames听起来更好。 - Marjan Venema
显示剩余3条评论
2个回答

5

我建议您查看Delphi安装包中包含的Resource Explorer演示。您可以在"c:\Users\Public\Documents\RAD Studio\9.0\Samples\Delphi\VCL\resXplor\resxplor.dpr" (根据不同的路径/Delphi版本进行调整) 中找到它。 在ExeImage.pas文件中,有一些类可以让您轻松地将资源分配给TPicture等。


这肯定是相关的,例如应用程序从exe中加载资源名称。我浏览了一下代码,但不想浪费时间去找到我需要的东西。我刚刚谷歌搜索了关键字EnumResourceNames以查找建议的信息。 - Alex

2

Ken White提出的EnumResourceNames非常完美,而且实现起来非常简单。无法接受它作为答案,因为他只留下了评论。

这是我的解决方案,使用了这个建议;

在我加载图像的过程中,我添加了以下代码行;

var
  returnVal:bool;
  hMdl: HMODULE;
begin
  hMdl:=LoadLibraryEX('FileNameWithResources.exe',0,LOAD_LIBRARY_AS_DATAFILE);
  // I load bitmaps so RT_BITMAP parameter is chosen
  returnVal:=EnumResourceNames(hMdl,RT_BITMAP,@Callback,0);

@callback函数返回一个布尔值。你需要将它放在类级别,实现类的代码之前。没有声明它的方式。我的类是单例的,所以我调用类级别过程来向TStringList添加值。如果你有一个更复杂的if语句并想要循环所有内容,请不要返回false。如果你在任何时候返回false,对这个函数的调用将结束,并且你将无法得到剩余的资源名称。

function Callback(handle:THandle;ResType:PChar;ResName:Pchar;long:Lparam):bool;stdcall;
var
      tempString: string;    
begin  
      tempString := resname;
      if length(tempString) > 0 then begin
        MyClassName.AddToResourceNames(tempString);
        result := true;
      end else
        result := false;
end;

我们难道不应该也调用FreeLibrary(hMdl)吗? - Gad D Lord
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Reinier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接