2011-03-22 37 views
19

Delphi XE VCL中是否支持确保应用程序的单个实例正在运行?如何确保只有我的应用程序的单个实例运行?

在过去,我使用库代码来控制一直显得复杂的Mutex。当我在Delphi XE中开始一个新项目时,我想知道是否需要挖掘旧代码,或者是否已经在XE中内置了支持?还是有另一个很容易应用的代码是很好的和现代的?

+1

是什么让你认为创建一个互斥体不是现代的? – jachguate 2011-03-22 17:01:41

+1

我已经为以下类型实现了跨多个用户会话的实例化:TEAppSingleInstance =(siYes,siMultipleAcrossUsers,siNo)。 “是”表示跨所有用户的单个实例,并不意味着每个用户都可以运行多个实例,而跨用户的多个意味着每个用户只能为其会话运行单个实例,但多个用户可以同时运行该应用程序。 – Misha 2011-04-19 01:44:00

+2

可能重复[如何判断我的程序的另一个实例是否已在运行?](http://stackoverflow.com/questions/459554/how-can-i-tell-if-another-instance-of-my -program-is-already-running) – 2013-08-28 15:21:29

回答

22

我用JCL来做到这一点:

program MyProgram; 

uses 
    JclAppInst; 

begin 
    JclAppInstances.CheckSingleInstance; // Added instance checking 
    Application.Initialize; 
    Application.CreateForm(TMainForm, MainForm); 
    Application.Run; 
end. 

文档对于这一点,和通知方式,是在the JCL Wiki

+0

使用JCL的+1。经过测试,有一天,甚至可以移植到不同的平台。 – 2011-03-22 17:22:48

+0

谢谢 - 这也有通知。不是在VCL中,而是下一个最好的事情。 – mj2008 2011-03-23 09:20:32

30

您在启动应用程序时创建了一个已命名的Mutex。检查GetLastError以查看其他实例是否已在运行。

把这段代码放在你的DPR文件的“开始”之后。将GUID替换为您自己的GUID中的一个。当我需要一个不太可能用于其他任何东西的文本常量时,我​​通常只需要点击Ctrl + G即可获得GUID!

if CreateMutex(nil, True, '6EACD0BF-F3E0-44D9-91E7-47467B5A2B6A') = 0 then 
    RaiseLastOSError; 

if GetLastError = ERROR_ALREADY_EXISTS then 
    Exit; 

它看起来像代码,因为它不节能的CreateMutex返回泄漏的句柄。不是。当我们的应用程序终止时,Windows会自动释放句柄,这对我们来说是绝对好的。

+0

是的,但是在Delphi XE中有没有对它的支持,还是它仍然是DIY? – mj2008 2011-03-22 11:44:09

+4

对于两行Windows API,您不需要特定的“Delphi XE”支持。确保你将'Windows'和'SysUtils'添加到DPR的uses子句中。 – 2011-03-22 11:47:39

+0

好的 - 我的旧代码将另一个实例放在前面,但在这种情况下,它并不重要。将接受新的编辑。 – mj2008 2011-03-22 11:48:34

相关问题