作为游戏副本保护的一部分,安装程序需要在安装过程后删除自己。此代码:
[Code]
procedure MyAfterInstall();
begin
DeleteFile('F:TEST_SETUPsetup.exe');
end;
不执行任何操作,因为安装程序正在运行。有没有一种解决方案可以运行"命令行"或cmd来获取安装程序的完整路径(它可能在客户端光盘上的任何位置),并在安装后将其删除?
在[CODE]部分添加以下方法,您就可以完成。。。
[CODE]
procedure CurStepChanged(CurStep: TSetupStep);
var
strContent: String;
intErrorCode: Integer;
strSelf_Delete_BAT: String;
begin
if CurStep=ssDone then
begin
strContent := ':try_delete' + #13 + #10 +
'del "' + ExpandConstant('{srcexe}') + '"' + #13 + #10 +
'if exist "' + ExpandConstant('{srcexe}') + '" goto try_delete' + #13 + #10 +
'del %0';
strSelf_Delete_BAT := ExtractFilePath(ExpandConstant('{tmp}')) + 'SelfDelete.bat';
SaveStringToFile(strSelf_Delete_BAT, strContent, False);
Exec(strSelf_Delete_BAT, '', '', SW_HIDE, ewNoWait, intErrorCode);
end;
end;
如果需要在安装后立即删除安装程序,则必须实现一些自定义解决方案。正如您已经发现的那样,可执行文件无法删除自身,因为可执行文件在运行时被锁定。
您可以实现一个由安装程序安装的小工具。安装完成后,安装程序将运行该工具。该工具将保持静默运行,并尝试删除安装程序,直到成功为止。
[Files]
; Install the tool
Source: "zapself.exe"; DestDir: "{app}"
[Run]
; Run the tool and pass the installer path
Filename: "{app}zapself.exe"; Parameters: "{srcexe}"
实际上,您不需要为此构建.exe
。动态创建的简单批处理文件可以执行以下操作:例如,请参阅从非托管进程卸载.NET DLL。
需要说的是,我真的不明白你为什么要这么做