如何在delphi中的RunTime中将文件数据添加到我的EXE文件中

时间:2016-03-28 06:38:08

标签: delphi

我创建了一个管理嵌入式数据库的应用程序

我的客户希望此应用程序位于一个文件中

我的任务是修改我的应用程序,以便它可以从exe中提取数据库文件,编辑它,并在运行时再次包含,而不是在编译时

2 个答案:

答案 0 :(得分:7)

可执行文件运行时无法修改可执行文件。这意味着为了实现您的目标,您需要另一个流程。您可以执行以下操作:

  1. 开始您的流程。
  2. 从过程映像中提取数据库。
  3. 更改数据库。
  4. 从原始图像中提取另一个可执行文件。
  5. 根据提取的图像启动第二个过程。
  6. 终止第一个进程。
  7. 让第二个进程使用修改后的DB更新磁盘映像。
  8. 坦率地说,这是一个非常可怕的想法。甚至不尝试这个。复杂性没有任何用处,整个概念都很脆弱。

    按照自然意图将数据保存在与程序分开的文件中。

答案 1 :(得分:3)

这当然是个坏主意,只要想想病毒扫描者将会想到这种方法。如果exe崩溃会发生什么,你的数据库现在会丢失所有更新吗?

您可以让exe创建一个包含所有所需文件的自解压存档。

其工作方式如下(步骤与上面的@David相同,只是列出的组件为您完成了大部分工作)。

  1. 提取自解压缩文件。
    这包含:提取时开始的真实exe 数据库
    重新创建一个新的自解压exe需要的一些文件

  2. 关闭程序后,它将创建一个新的zip文件,包括:
    本身(只读形式) 数据库 重新创建一个新的自解压exe需要的一些文件

  3. 然后它会将zip文件转换为新的自解压exe 新的自解压存档将按照#1启动其嵌入的zip文件中包含的exe。

  4. 这是来自sfx-zip-delphi的一些示例代码。

    program SelfExtractingZip;
    
    {$APPTYPE CONSOLE}
    
    uses
      // Add a ZipForge unit to the program
      SysUtils, ZipForge, Classes;
    
    var
      archiver : TZipForge;
    
    begin
      // Create an instance of the TZipForge class
      archiver := TZipForge.Create(nil);
      try
      with archiver do
      begin
        // Set the name of the archive file we want to create.
        // We set extension to exe because we create a SFX archive
        FileName := 'C:\test.exe';
        // See SFXStub demo in ZipForge\Demos\Delphi folder
        // to learn how to create a SFX stub
        SFXStub := 'C:\SFXStub.exe';
        // Because we create a new archive,
        // we set Mode to fmCreate
        OpenArchive(fmCreate);
        // Set base (default) directory for all archive operations
        BaseDir := 'C:\';
        // Add the C:\test.txt file to the archive
        AddFiles('c:\test.txt');
        CloseArchive();
      end;
      except
      on E: Exception do
        begin
          Writeln('Exception: ', E.Message);
          // Wait for the key to be pressed
          Readln;
        end;
      end;
    end.
    

    自我提取的解决方案

    <强>付费
    如果您需要付费解决方案:http://www.componentace.com/sfx-zip-delphi.htm

    <强>免
    或免费:http://tpabbrevia.sourceforge.net/Self-Extracting_Archives
    自解压文件的abbrevia文档位于:https://sourceforge.net/projects/tpabbrevia/postdownload?source=dlp
    见第293页。