只允許一個應用程式執行個體

來源:互聯網
上載者:User

 

最近在研究這個問題,想限制只有一個應用程式執行個體。不過這個問題已經是老生常談的話題了,去網上搜尋一下,一大堆的結果。通常的做法都是通過 Mutex 或者 FindWindow 來進行,可是並不符合本文的需求。因為我要達到的要求是:

1、首先肯定只允許一個應用程式執行個體運行;

2、當第二個執行個體運行時,啟用第一個執行個體,並可將相應的參數(比如需要處理的新檔案名稱)傳遞給第一個執行個體;

3、鑒於 FrameWnd 和 Dialog 基類的處理方式(Dialog 的 DoModal() 會導致 padding)不一樣,要求可以通用;

4、代碼簡潔高效,不想把這一個功能分散到 App 類和 Frame/Dialog 類,一個地方能搞定的就一個地方搞定。

 

常規的做法,比如 Mutex,可以達到第一點,但是無法實現第 2 點;用 FindWindow 的做法,完全沒有考慮到視窗標題的變化(比如單文檔或多文檔,程式標題常變化),根本不可能做到通用;好不容易在 CodeProject 上找到一篇很有價值的文章,PJ Naughter 寫的,整體是很不錯,不過可惜的是沒有達到第 4 點,完成這一個功能還要在好幾個類裡面加代碼,似乎有些麻煩。

...

難道就沒有合適的辦法了嗎?

 

有的!答案是肯定的。

其實 PJ Naughter 為我們指出了一條明路:在應用程式執行個體間共用資料,首選記憶體對應檔 MMF (Memory Mapped File),通過它建立一個指向虛擬記憶體檔案控制代碼,以便確定確定只有一個應用程式執行個體。

那啟用第一個執行個體怎麼辦?我們只有在一個地方(InitInstance)有代碼,此時在 Frame/Dialog 完全還沒建立,所以要啟用第一個執行個體,也就沒有第一個執行個體的視窗控制代碼了,怎麼辦?

好辦,咱不是還有 EnumWindows、EnumThreadWindows 嗎?枚舉唄,在我們第二個執行個體啟動並執行時候,第一個執行個體的主視窗控制代碼是肯定有了,並且有效(IsWindow),所以只要枚舉擷取了主視窗的控制代碼,剩下的啟用主視窗、關閉第一個執行個體啥的都好辦(這也是我轉載上一篇文章的原因)。

還有一個大的問題,就是傳參。前面說了,如果第 2 個執行個體啟動的時候帶命令列,比如檔案、列印等,那我們需要把這個參數傳遞給第一個應用程式執行個體。說白了就是處理序間通訊的事情,檔案?註冊表?都不合適,我覺得,只有訊息,還是 Windows 的訊息機制是正統。但是常規的訊息是不行的,不是null 指標就是亂碼,只有 WM_SETTEXT、WM_COPYDATA 最合適,而這兩個中,後者還支援可以傳遞結構,所以選定後者作為參數傳遞的訊息載體。

 

最終完成之後的調用代碼:

 

BOOL CDemoProjDlg::InitInstance()<br />{<br /> //檢查應用程式執行個體<br /> CXInstanceChecker objXInstanceChecker;<br /> if (objXInstanceChecker.IsPreviousInstanceRunning())<br /> {<br /> objXInstanceChecker.ActivatePreviousInstance();<br /> return FALSE;<br /> }<br /> objXInstanceChecker.TrackSingleInstance();</p><p> //...<br />}<br />

 

hoho,是不是簡潔多了?

 

 

 

參考文獻:

CSingleInstance - Single Instance Apps

http://www.codeproject.com/KB/cpp/csingleinst.aspx

 

Avoiding Multiple Instances of an Application

http://www.codeproject.com/KB/cpp/avoidmultinstance.aspx

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.