Delphi 如何将资源编译到应用程序中并访问它们?

Delphi 如何将资源编译到应用程序中并访问它们?,delphi,resources,package,Delphi,Resources,Package,如何制作一个包含DLL和图像资源文件的可执行文件包 那么如何在运行时从可执行文件中提取它们呢?选项1使用IDE(Delphi 2007或更高版本): procedure ExtractResource(ResName: String; Filename: String); var ResStream: TResourceStream; begin ResStream:= TResourceStream.Create(HInstance, ResName, RT_RCDATA); tr

如何制作一个包含DLL和图像资源文件的
可执行文件


那么如何在运行时从可执行文件中提取它们呢?

选项1使用IDE(Delphi 2007或更高版本):

procedure ExtractResource(ResName: String; Filename: String);
var
  ResStream: TResourceStream;
begin
  ResStream:= TResourceStream.Create(HInstance, ResName, RT_RCDATA);
  try
    ResStream.Position:= 0;
    ResStream.SaveToFile(Filename);
  finally
    ResStream.Free;
  end;
end;
您可以单击“项目”菜单,然后选择“资源…”,您可以将任何文件加载到其中。出于您的目的,这将是RC_数据

不带IDE的选项2

如果没有上述选项,则需要使用BRCC32(Borland资源编译器)从RC文件创建一个.RES文件,然后将其链接到应用程序。要在不使用IDE的情况下链接资源文件,请尝试以下操作:

例如,我们想添加几个DLL文件,DLL文件的名称为MyLib1.DLL和MyLib2.DLL,以添加此打开的记事本,并键入以下内容:

MYLIB1 RCDATA.。\MYLIB1.dll

MYLIB2 RCDATA.。\MYLIB2.dll

请确保..\xxx.dll路径正确,因此显然需要对其进行编辑

现在您需要将其保存为.rc文件,因此文件>另存为..(确保下拉筛选器为“所有文件”),并将其命名为MyResources.rc。现在,您需要使用资源编译器生成Res文件,使用以下控制台命令:

BRCC32 MyResources.RC

您可以使用命令提示符“开始菜单>运行>cmd.exe”编写该命令,或者您也可以在Delphi安装程序的bin文件夹中找到BRCC32.exe并将MyResource.RC文件拖到

这将创建一个名为MyResources.Res的Res文件,您可以将其包含在应用程序的主Delphi表单中,如下所示:

{$R *.dfm}
{$R MyResources.res} 
您可以使用以下方法提取资源:

procedure ExtractResource(ResName: String; Filename: String);
var
  ResStream: TResourceStream;
begin
  ResStream:= TResourceStream.Create(HInstance, ResName, RT_RCDATA);
  try
    ResStream.Position:= 0;
    ResStream.SaveToFile(Filename);
  finally
    ResStream.Free;
  end;
end;

我发现方便的方法是使用.zip容器

然后您将有两个实现:

  • 将一些.zip内容附加到现有的.exe中,.exe代码将根据请求检索.zip内容

  • 将.zip内容作为资源嵌入,然后根据请求提取每个内容

  • 解决方案1将在编译后添加.zip内容。而2将在编译时添加.zip内容。对于安装程序,我认为解决方案1对我来说是有意义的。对于检索链接到特定exe版本的某些所需文件(库,甚至位图或文本)的方法,可以设想解决方案2

    使用.zip作为格式可以轻松解析内容,并允许压缩。使用像TotalCommander这样的工具,您甚至可以在.exe上使用Ctrl+PgDown来读取.zip文件内容。非常方便

    您将了解如何实现解决方案1,以及(同一页,但另一篇文章)如何使用
    TZipRead.Create()
    构造函数直接访问捆绑为资源的.zip。您将在我们的存储库中找到它如何与工作应用程序协同工作:例如,我们如何在SynProject可执行文件中嵌入图标、文本内容和graphviz+拼写检查器库


    关于性能,这两种解决方案之间没有区别,至少在我们的代码中是这样。两者都使用内存映射文件来访问内容,因此或多或少都是相同的:非常快。

    谢谢,我如何在不使用IDE的情况下添加新资源(编写代码)?如果是“代码”,您指的是我建议的第二个选项,那么我也将编辑我的第一个答案以显示这种方式。对不起,我无法理解此部分:
    使用此控制台命令:BRCC32 MyResources.RC
    我应该在何处编写此命令?您可以将MyResources.RC本身添加到项目中,而无需手动编译到.resIn Delphi 2007,项目菜单下没有资源项。可能的答案包括“将它们添加为资源”到“最好使用安装程序生成器”改为“不,你不能那样做。”“这取决于您希望将文件放入可执行文件的原因,以及文件进入可执行文件后您希望对其执行的操作。那么,是什么,为什么?因为我将把这个文件作为一个可下载的文件使用,接下来会发生什么并不重要。@Kermia,除非你为了练习而这样做,否则你对这个大的EXE文件所做的一切将在世界上产生巨大的变化。提示:如果您的EXE依赖于DLL,则将它们作为资源存储在同一个EXE中将不起作用,因为除非先提取它们,否则无法链接到它们。如果你这样做是为了下载大小,请考虑使用安装程序。如果我记得有一个叫ExeMod的Delphi示例(不是我写的,你必须用谷歌搜索),这展示了一种创建你自己的安装程序的方法,search ExeMod.pas-这可能是一种粗糙的方法,但如果我记得的话,它是有效的。否则,我看不出有什么理由不这样做。@Craig,@Kermia,如果你想编写自己的安装程序,一个好的起点就是看看如何工作。它是用Delphi编写的开源软件!不妨修改它来做您需要的事情,而不是从头开始。甚至可能会发现您不需要编写自己的,因为它非常好。+1表示“将数据附加到exe”。更适合安装程序,显然OP就是这么做的。最后,我下载了它,但现在,当我要使用它时,我得到了以下错误:
    [DCC Error]SynZip.pas(1179):找不到E1026文件:'deflate.obj'
    [DCC Error]SynZip.pas(1179):E1026未找到文件:“deflate.obj”
    查看源代码存储库:您可以从中下载所有需要的.obj文件