我在 Delphi 中重写了一个 VB6 应用程序。它应该只运行一个实例。我怎样才能用最少的代码做到这一点?
在 VB6 中,我们只需要使用一行代码 >
If App.PrevInstance Then '采取一些行动 End If
在 goggling 时,我确实找到了一个解决方案,但它很长,我们必须弄乱 .drp 文件。
我不想那样做。
我想要更简单的东西。
我在 Delphi 中重写了一个 VB6 应用程序。它应该只运行一个实例。我怎样才能用最少的代码做到这一点?
在 VB6 中,我们只需要使用一行代码 >
If App.PrevInstance Then '采取一些行动 End If
在 goggling 时,我确实找到了一个解决方案,但它很长,我们必须弄乱 .drp 文件。
我不想那样做。
我想要更简单的东西。
请注意,在许多情况下,用户的期望是启动第二个实例会导致第一个实例被恢复并被带到前台。不要期望用户理解恢复最小化/隐藏的应用程序与从快捷方式或开始菜单启动之间的区别。
我有一些代码如下:
变量 应用互斥体:THandle; { .... } 初始化 // 创建互斥体 AppMutex := CreateMutex(nil, True, 'MY-APPLICATION-NAME'); 如果 (AppMutex = 0) 或 (GetLastError = ERROR_ALREADY_EXISTS) 那么 开始 MessageDlg('我的应用程序已经在这台计算机上运行。'#13#10+ '你应该在开始一个新实例之前关闭另一个实例。',mtError, [mbOK],0); 停; 结尾; 定稿 // 关闭互斥锁 关闭句柄(AppMutex);
但我确信@mghie 链接到的线程中的答案是更有帮助/更丰富的功能!
编辑:请注意,您可以自行将其制成一个小单元,然后在您的项目中使用该单元。
以我的经验,一般来说,一个应用程序是否启动两次是无法决定的。例如,如果它是在另一个文件夹或另一个用户帐户下启动的,则启动相同的应用程序可能是完全有效的。另一方面,如果两个不同的应用程序在同一个文件夹中启动,它们可能无法一起运行。
因此,除了使用互斥体和信号量以及处理竞争条件的不同方法之外,明智地选择互斥体或信号量的名称可以适当地处理上述组合。
如果应用程序可能根本不会运行两次,请使用 GUID 之类的名称。如果您可以忽略有人可能重命名它,您甚至可以使用 exe 的文件名。
限制特定文件夹的一次性启动,您可以考虑 exe 路径,但请注意,由于映射不同的路径可能最终在同一个 exe 中。