Delphi XE VCL中是否支持确保应用程序的单个实例正在运行?如何确保只有我的应用程序的单个实例运行?
在过去,我使用库代码来控制一直显得复杂的Mutex。当我在Delphi XE中开始一个新项目时,我想知道是否需要挖掘旧代码,或者是否已经在XE中内置了支持?还是有另一个很容易应用的代码是很好的和现代的?
Delphi XE VCL中是否支持确保应用程序的单个实例正在运行?如何确保只有我的应用程序的单个实例运行?
在过去,我使用库代码来控制一直显得复杂的Mutex。当我在Delphi XE中开始一个新项目时,我想知道是否需要挖掘旧代码,或者是否已经在XE中内置了支持?还是有另一个很容易应用的代码是很好的和现代的?
我用JCL来做到这一点:
program MyProgram;
uses
JclAppInst;
begin
JclAppInstances.CheckSingleInstance; // Added instance checking
Application.Initialize;
Application.CreateForm(TMainForm, MainForm);
Application.Run;
end.
文档对于这一点,和通知方式,是在the JCL Wiki。
使用JCL的+1。经过测试,有一天,甚至可以移植到不同的平台。 – 2011-03-22 17:22:48
谢谢 - 这也有通知。不是在VCL中,而是下一个最好的事情。 – mj2008 2011-03-23 09:20:32
您在启动应用程序时创建了一个已命名的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会自动释放句柄,这对我们来说是绝对好的。
是什么让你认为创建一个互斥体不是现代的? – jachguate 2011-03-22 17:01:41
我已经为以下类型实现了跨多个用户会话的实例化:TEAppSingleInstance =(siYes,siMultipleAcrossUsers,siNo)。 “是”表示跨所有用户的单个实例,并不意味着每个用户都可以运行多个实例,而跨用户的多个意味着每个用户只能为其会话运行单个实例,但多个用户可以同时运行该应用程序。 – Misha 2011-04-19 01:44:00
可能重复[如何判断我的程序的另一个实例是否已在运行?](http://stackoverflow.com/questions/459554/how-can-i-tell-if-another-instance-of-my -program-is-already-running) – 2013-08-28 15:21:29