就很简单的一个功能,Inno setup制作的安装包,在安装时候,判断是否之前有本程序的实力在运行,运行的话终止他,貌似很简单,折腾了我1小时。
网上找的好多方案,不理想不理想!我就给大家列举下这些我认为不理想的原因!
网上方案1: 在Code段用FindWindowByWindowName、FindWindowByClassName……对不起我的客户端的标题是会变的啊!我的客户端主窗口是对话框啊,窗口类名都一样(#32770)啊!
网上方案2: 用个叫IsTask.dll的外部扩展,Inno setup没,自己网上下,说白了就是个用c++写的一个dll,自己也能写,回头用Code pascal语言调用……,RunTask、KillTask用的这两个函数……,蛋疼的事情发生了,本来秒开的安装包,要卡个5秒以上在打开……怀疑是IsTask.dll破吧,自己写个,c++中char对应pascal中PAnsiChar,函数导出调用方案方法注意stdcall,弄好,还是通过进程名加载dll……结果……卡……5秒以上……原来是inno setup自己low……升级inno setup到最新5.5.9,一样……
网上方案3: 找啊找老半天,发现SETUP段里可以家个APPMUTEX,不错,我的exe里为了不能多开也弄了个非匿名的mutex,马上家上一句话,点开安装……我了个去,结果只是提示你有你的exe在运行,自己去关闭吧……啥体验啊……
自己的方案,很简单通过checkmutex判断是否在运行,是的话通过ShellExec 打开cmd用taskkill杀死进程……完美解决,也不会加载dll卡的5秒,体验棒棒哒。
[Code]
var ErrorCode: Integer;
function InitializeSetup(): Boolean;
begin
if CheckForMutexes('CZY_CLIENT_BY_WX') then
begin
if MsgBox('检测到你的超自由客户端正在运行中!'#13'点击 "是" 关闭超自由客户端继续安装;'#13'点击 "否" 退出安装程序!', mbConfirmation, MB_YESNO) = IDYES then
begin
ShellExec('open', ExpandConstant('{cmd}'), '/c taskkill /f /t /im CZYClient.exe', '', SW_HIDE, ewNoWait, ErrorCode);
Result:= true;
end
else
Result:= false;
end
else
Result:=true;
end;