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