16,748
社区成员
发帖
与我相关
我的任务
分享
function InitializeSetup():Boolean;
begin
Result := true;
HasRun := FindWindowByWindowName('正在运行的程序名');
while HasRun<>0 do
begin
if MsgBox('安装程序检测到你的应用程序正在运行。' #13#13 '您必须先关闭它然后单击“是”继
续安装,或按“否”退出!', mbConfirmation, MB_YESNO) = idNO then
begin
Result := false;
HasRun := 0;
end
else
begin
Result := true;
HasRun := FindWindowByWindowName('安装程序名称);
end;
end;
end;
[Setup]: AppMutex
这个指令用于防止用户在应用程序仍在运行的情况下安装新的应用程序版本,以及防止用户卸载正在运行的应用程序。它指定一个或多个已命名互斥中的名字 (多重互斥用逗号隔开),安装程序和卸载程序在启动时检查该名字。如果没有退出,安装程序/卸载程序将显示消息: “[安装程序或卸载程序] 发现 [AppName] 当前正在运行,请现在关闭所有运行中的程序,请先关闭所有运行的窗口,然后单击“确定”继续,或按“取消”退出。”。这个值可以包含常量。
使用这个指令需要你添加代码到你的应用程序,这个应用程序是用你在这个指令中指定的名字创建一个互斥的应用程序。下面是在 Delphi、C 和 Visual Basic 创建一个互斥的示例。该代码将在应用程序启动时执行。
Delphi:
CreateMutex(nil, False, 'MyProgramsMutexName');
C:
CreateMutex(NULL, FALSE, "MyProgramsMutexName");
Visual Basic (由 Peter Young 提交):
'放在声明段:
Private Declare Function CreateMutex Lib "kernel32" _
Alias "CreateMutexA" _
(ByVal lpMutexAttributes As Long, _
ByVal bInitialOwner As Long, _
ByVal lpName As String) As Long
'放在启动代码 (Form_Load 或 Sub Main):
CreateMutex 0&, 0&, "MyProgramsMutexName"
你不需要的你的应用程序终止之后指明退出互斥对象,系统会自动执行。也不推荐你这么做,因为理想的互斥对象应该在进程完成终止后退出。
请注意互斥名比较在 Windows 中是区分大小写的。
To specify a mutex name containing a comma, escape the comma with a backslash.
查阅 MS SDK 帮助中的 CreateMutex 主题获取有关互斥的更多信息。
示例:
AppMutex=MyProgramsMutexName