寻找应用程序先前实例的最简单方法

3
我已经用Delphi重写了一个VB6应用程序。它应该只有一个实例在运行。如何使用最少的代码来实现这一点?
在VB6中,我们只需要使用一行代码
``` If App.PrevInstance Then 'Take some action End If ```
在搜索引擎上,我确实找到了一个解决方案,但是它很复杂,我们必须动手操作`.drp`文件。
我不想这样做。
我希望有更简单的方法。

3
这个主题的详细讨论可以在这里找到答案:https://dev59.com/AXRB5IYBdhLWcg3w77sn,其中包括封装低级代码的组件链接。 - mghie
Yogi,如果你只想知道之前是否存在一个实例,那么这个问题就是Mghie链接的重复。但是,如果你想了解有关该先前实例的其他信息,那么这个问题就不是重复的。请澄清:你的代码示例表明你只想检查存在性,但你的问题标题表明你想了解更多信息。 - Rob Kennedy
Rob,我想了解更多。我已经阅读了很多关于这个主题的文章,但是所需的编码量对我来说仍然令人生畏。我想要理解,并且如果可能的话,让它像VB6一样简单!代码示例只是为了给出我在VB6应用程序中使用过的想法。 - Yogi Yang 007
3个回答

3
我有一些类似于以下代码:
var
    AppMutex: THandle;
{ .... }
initialization // 创建互斥体 AppMutex := CreateMutex(nil, True, 'MY-APPLICATION-NAME'); if (AppMutex = 0) or (GetLastError = ERROR_ALREADY_EXISTS) then begin MessageDlg('我的应用程序已经在这台电脑上运行。'#13#10+ '您应该在启动新实例之前关闭另一个实例。',mtError, [mbOK],0); Halt; end;
finalization // 关闭互斥体 CloseHandle(AppMutex);
但我确信@mghie链接的线程中的答案更有帮助/功能更丰富!
编辑:请注意,您可以将此转化为一个小模块,然后在项目中使用该模块。

3
请注意,在许多情况下,用户的期望是启动第二个实例会导致第一个实例被恢复并置于前台。不要指望用户理解恢复最小化/隐藏应用和从快捷方式或开始菜单启动之间的区别。

5
欢迎来到 Stack Overflow。你发布的内容并不能回答问题,因此不应该放在回答部分,而应该放在评论中。一旦您获得了50个声誉点,就可以在别人的问题和答案中发表评论,而不仅仅是在自己的问题上。请注意,那些实际上没有回答问题的回答可能会被投票打下来。 - Rob Kennedy

1
根据我的经验,一般无法确定应用程序是否可以启动两次。例如,如果在另一个文件夹或其他用户帐户下启动相同的应用程序,则完全可以有效地启动相同的应用程序。另一方面,如果在同一文件夹或其他地方启动两个不同的应用程序,则可能无法同时运行它们。
因此,除了使用互斥量和信号量以及处理竞态条件的不同方法之外,明智地选择互斥量或信号量的名称来适当处理上述组合也非常重要。
如果应用程序根本不能运行两次,请使用GUID(全局唯一标识符)作为名称。甚至可以使用exe文件名,如果您可以忽略有人可能会更改其名称。
如果要限制单次启动到特定文件夹,则可以考虑exe路径,但请注意,由于映射的不同路径可能会导致相同的exe文件出现在不同的路径中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接