限制應用程式的例項數目

2021-03-31 08:57:00 字數 1307 閱讀 3430

某些應用程式處理緊缺資源,例如可擦寫光碟機、串列埠或者大量記憶體,通常不希望這種應用程式的多個例項同時執行。

實際上你沒有辦法限制使用者只能啟動一次。你可以做到的是在應用程式啟動之後查詢是否使用者啟動了另乙個例項。如果沒有找到現存的例項,應用程式以正常方式啟動。否則,通常的處理是退出。

要查詢現存的例項,可以查詢程序列表,比較每乙個程序的檔名稱和本應用程式的檔名稱,如果找到了和檔名匹配的程序,那麼認為應用程式已經啟動了(參考平台sdk的spy示例和visual c++的tlist示例)。這種方法的缺點是需要額外的工作(例如列舉找到的程序的視窗)來傳遞命令列引數。關於如何列舉乙個程序或者執行緒的視窗,可以參考getwindowthreadprocessid。也可以用約定的暗號來識別,例如建立乙個物件,具有很難重複的屬性,然後查詢系統中是否已經有了同樣屬性的物件。通常建立互斥體(mutex)或者具有指定視窗類的視窗(不適用於對話方塊,因為對話方塊的視窗類是#32770)。一些其他的方法包括檢查視窗過程處理特定訊息的返回值、檢查視窗的約定屬性等等。建議用互斥體對建立物件的**加鎖,以避免同時建立兩個物件。

有的程式在退出之前需要把命令列引數傳遞給現存的例項,例如一些文件處理程式和瀏覽器。官方的方法是在登錄檔中對應的檔案型別中註冊ddl命令:hkcr/filetype/shell/open/ddeexec = open("%1")。 遺憾的是,mfc只在cframewnd類裡面實現了對dde的封裝。如果你的程式不基於文件檢視框架,那麼實現dde支援是很麻煩的事情。幸好你不必這麼做,比較簡單的方法是傳送乙個訊息——例如wm_copydata——到找到的現存例項視窗,傳遞命令列引數作為引數。

mfc示例m***i演示了如何在mdi程式中在單獨的執行緒中建立視窗,以及相應修改訊息和命令傳遞過程。雖然這樣應用程式改動最少,但是這打破了doc/view架構,而且頂層視窗還是在乙個執行緒中。

用對話方塊作為頂層視窗是最簡單的,在單獨的執行緒中建立對話方塊也很容易,但是在對話方塊上建立工具欄要編寫一些額外的**來模仿框架的行為,而且沒有文件檢視的支援,需要自己編寫開啟文件和**的**。還有一些其它的***,例如需要在對話方塊上實現工具欄、狀態列選單的自動更新,不能通過自定義視窗類的辦法查詢現有的應用程式例項等等。

編寫多頂層視窗文件處理程式時,在現存例項執行時,在資源管理器開啟新的檔案的實現是,新的例項傳送命令引數到現存例項,建立乙個新的頂層視窗之後退出。有很多種方法獲得這個引數。mfc程式當然也是c++程式,所以標準c的argc和argv主函式入口引數仍然有效。但是mfc提供了命令列處理的封裝類c***mandlineinfo,支援了標準的命令列開關的分析。但是更有效地處理命令列引數的辦法還是採用msj2023年10月中的c++q&a專欄的c***mandlineinfoex類。它提供了自定義命令列開關分析的方法。

WPF 單例項應用程式

例如 microsoft word,不管開啟多少個文件 也不管它們是如何開啟的 一次只能載入 winword.exe 乙個例項。這便是單例項應用程式。但是最簡單的實現方法,並且也是wpf團隊當前推薦的方法是,使用windows窗體提供的內建支援,這一內建支援最初是用於 visual basic 應用...

乙個應用程式例項

在開發一些應用系統的時候,由於程式內在的一些特徵,系統的某些組成子程式只允許執行乙個應用程式例項,以保證業務和資料處理安全。本文將從實際應用角度來分析其實現原理,對三種實現方式進行測試比較,從而確定一種合適的實現方法。文章的例子使用c 語言進行描述。程序匹配 對於每乙個應用程式執行例項都會包含該例項...

QT應用程式單例項執行

我們經常會做一些軟體 程式只希望有最多乙個執行例項。我從網上找到了個方法,雖然現在還不太明白原理,但是這種方法總算會用了。原文摘自 int main int argc,char argv if sharemem create 1 return 0 當然別忘了在開頭加上 include 這段 應該不用...