我创建了一个管理嵌入式数据库的应用程序
我的客户希望此应用程序位于一个文件中
我的任务是修改我的应用程序,以便它可以从exe中提取数据库文件,编辑它,并在运行时再次包含,而不是在编译时
答案 0 :(得分:7)
可执行文件运行时无法修改可执行文件。这意味着为了实现您的目标,您需要另一个流程。您可以执行以下操作:
坦率地说,这是一个非常可怕的想法。甚至不尝试这个。复杂性没有任何用处,整个概念都很脆弱。
按照自然意图将数据保存在与程序分开的文件中。
答案 1 :(得分:3)
这当然是个坏主意,只要想想病毒扫描者将会想到这种方法。如果exe崩溃会发生什么,你的数据库现在会丢失所有更新吗?
您可以让exe创建一个包含所有所需文件的自解压存档。
其工作方式如下(步骤与上面的@David相同,只是列出的组件为您完成了大部分工作)。
提取自解压缩文件。
这包含:提取时开始的真实exe
数据库
重新创建一个新的自解压exe需要的一些文件
关闭程序后,它将创建一个新的zip文件,包括:
本身(只读形式)
数据库
重新创建一个新的自解压exe需要的一些文件
然后它会将zip文件转换为新的自解压exe 新的自解压存档将按照#1启动其嵌入的zip文件中包含的exe。
这是来自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页。