2011-03-22 77 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

相關問題