我正在用 Delphi7 编写一个更新程序,它将运行一次,但需要运行许多文件。
我想要实现的目标:
- 用户运行exe
- Exe 解压文件,运行更新程序
- 如果更新程序检测到错误,提示用户发送登录电子邮件
- 更新程序运行后,临时文件被删除(其中一些文件是更新程序使用的dll,因此必须关闭更新程序才能删除文件)
谁能推荐一个好的解决方案?我考虑过使用 Inno Setup(对于这样一个简单的任务来说太复杂了)或使用自解压 zip 文件(但之后如何删除文件)?
谢谢!
我正在用 Delphi7 编写一个更新程序,它将运行一次,但需要运行许多文件。
我想要实现的目标:
谁能推荐一个好的解决方案?我考虑过使用 Inno Setup(对于这样一个简单的任务来说太复杂了)或使用自解压 zip 文件(但之后如何删除文件)?
谢谢!
我个人会使用 Inno Setup,因为它非常适合此类任务。使用脚本事件删除文件非常容易,并且作为安装后步骤的一部分执行删除。
我正在为我的更新程序使用资源。我是用 brcc32 编译资源而不是编译更新程序。当更新程序运行它的自我检查一切并用新的写入或更新时。但是关于这个过程,你必须在你的程序运行的地方正确地写入、删除权限。
我在下面添加示例代码。
文件 exe.rc
newprog RCDATA Application.exe
文件 makeres.bat
brcc32 exe.rc
文件更新程序.dpr
{$R exe.res}
单位文件和程序
procedure ExtractRes(resname,fname,ext:string);
var
rStream:TResourceStream;
fStream:TFileStream;
fNamex:string;
begin
fNamex:=ExtractFilePath(Application.ExeName)+fname+'.'+ext;
if not fileExists(fnamex) then
begin
try
rStream:=tresourcestream.Create(hinstance,ResName,RT_rcDATA);
fStream := TFileStream.Create(fnamex, fmCreate);
fStream.CopyFrom(rStream, 0);
finally
rStream.Free;
fstream.Free;
end;
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
apath:string;
begin
if Timer1.Enabled then
Timer1.Enabled:=false;
apath:=ExtractFilePath(Application.ExeName);
lblMesg.Caption:='Backup old version';
Application.ProcessMessages;
if FileExists(apath+'Application_old.bak') then
DeleteFile(apath+'Application_old.bak') ;
while FileExists(apath+'Application.exe') do
begin
RenameFile(apath + 'Application.exe', apath + 'Application_old.bak');
sleep(1);
if FileExists(apath+'Application.exe') then
begin
lblMesg.Caption:='It seems application still running. Waiting for end';
if FileExists(apath+'Application_old.bak') then
DeleteFile(apath+'Application_old.bak');
DeleteFile(apath+'Application.exe');
end;
Application.ProcessMessages;
end;
lblMesg.Caption:='Creating New Version..';
Application.ProcessMessages;
ExtractRes('Application','Application','exe');
lblMesg.Caption:='Running New Version...';
Application.ProcessMessages;
WinExec(pchar(apath+'Application.exe'),sw_show);
Application.ProcessMessages;
Halt;
end;
我认为这可以帮助您的 1,2,3 问题。对于 4,您可以扩展代码。
也许不是 Delphi 的答案,但如果您购买WinRAR的许可证,您可以使用内置的简单设置功能(您压缩为 sfx 文件,脚本存储在注释文件中)
非常好用,可以自行清理,压缩效果很好!