问题描述
|
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.
有关此文档和通知方案的文档,请参见JCL Wiki。,启动应用程序时,您将创建一个名为Mutex的文件。检查“ 1”以查看其他实例是否已在运行。
将此代码放在DPR文件中\“开始\”之后。用自己的一个替换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会自动释放该句柄,这对我们来说绝对可以。