我在Delphi中重写了一个VB6应用程序。它应该只有一个实例在运行。如何用最少的代码完成这项工作?
在VB6中,我们只需要使用一行代码 >
如果是App.PrevInstance那么 '采取一些行动 结束如果
在goggling我找到了解决方案,但它很长,我们不得不乱用.drp文件。
我不想那样做。
我想要更简单的东西。
答案 0 :(得分:3)
我有一些代码:
var AppMutex: THandle; { .... } initialization // Create the mutex AppMutex := CreateMutex(nil, True, 'MY-APPLICATION-NAME'); if (AppMutex = 0) or (GetLastError = ERROR_ALREADY_EXISTS) then begin MessageDlg('My application is already running on this computer.'#13#10+ 'You should close the other instance before starting a new one.',mtError, [mbOK],0); Halt; end; finalization // Close the mutex CloseHandle(AppMutex);
但我确信@mghie链接的帖子中的答案更有用/更丰富!
编辑:注意你可以把它变成一个独立的小单元,然后在你的项目中使用那个单元。
答案 1 :(得分:3)
请注意,在许多情况下,用户的预期是启动第二个实例会导致第一个实例被还原并带到前台。不要指望用户理解恢复最小化/隐藏应用程序与从快捷方式或开始菜单启动之间的区别。
答案 2 :(得分:1)
根据我的经验,一般情况下无法确定应用程序是否可以启动两次。例如,如果它在另一个文件夹中或在另一个用户帐户或其他任何内容下启动,则启动相同的应用程序可能是完全有效的。另一方面,如果两个不同的应用程序在相同的文件夹中启动,则它们可能无法一起运行。
除了使用互斥锁和信号量以及处理竞争条件的不同方法之外,还可以明智地选择互斥锁或信号量名称来正确处理上述组合。
如果应用程序可能根本不运行两次,请使用GUID之类的名称。如果你可以忽略有人可能会重命名它,你甚至可以使用exe的文件名。
限制特定文件夹上的一次性启动,您可以考虑exe路径,但请注意,由于映射,不同的路径可能会以相同的exe结束。