MFC 只允許產生乙個應用程式例項的具體實現

2021-07-04 10:57:26 字數 1338 閱讀 8849

windows是多程序作業系統,框架生成的應用程式可以多次執行,形成多個執行例項。但在有些情況下為保證應用程式的安全執行,要求程式

只能執行乙個例項,比如程式要

使用只能被乙個程序單獨使用的特殊硬體(例如數據機)時,必須限制程式只執行乙個例項。

這裡涉及兩個基本的問題:一是在程式的第二個例項啟動時,如何發現該程式已有乙個例項在執行;二是如何將第乙個例項啟用,而使

第二個

例項退出。

對於第乙個問題,可以通過給應用程式設定互斥量/訊號量,例項啟動時首先檢測該訊號量,如已存在,則說明程式已執行乙個例項。第二個問

題的難點是獲取第乙個例項的主

窗物件指標或控制代碼,然後便可用setforegroundwindow來啟用。雖然findwindow函式能尋找正執行著的窗

口,但該函式要求指明所尋找視窗的標題或視窗類名,不是實現通

用方法的途徑。我們可以用win 32 sdk函式setprop來給應用程式主窗設

置乙個特有的標記。用getdesktopwindow可以獲取windows系

統主控視窗物件指標或控制代碼,所有

應用程式主窗都可看成該視窗的子視窗,

即可用getwindow函式來獲得它們的物件指標或控制代碼。用win 32 

sdk函式getprop查詢每一應用程式主窗是否包含有我們設定的特

定標記

便可確定它是否我們要尋找的第乙個例項主窗。使第二個例項退出很

簡單,只要讓其應用程式物件的initinstance函式返回false即

可。此

外,當主視窗退出時,應用

removeprop函式刪除我們為其設定的標記。

::setforegroundwindow(hpre);
::setforegroundwindow(::getlastactivepopup(hpre));
return

false;

}
hpre = ::getwindow(hpre,gw_hwndnext);
}
}
//......
//以下省略
}

cwnd:

int cmfc***dlg::oncreate(lpcreatestruct lpcreatestruct)

void cmfc***dlg::ondestroy()

MFC 只允許產生乙個應用程式例項的具體實現

有改動。windows是多程序作業系統,框架生成的應用程式可以多次執行,形成多個執行例項。但在有些情況下為保證應用程式的安全執行,要求程式 只能執行乙個例項,比如程式要 使用只能被乙個程序單獨使用的特殊硬體 例如數據機 時,必須限制程式只執行乙個例項。這裡涉及兩個基本的問題 一是在程式的第二個例項啟...

只允許程式執行乙個例項

有兩類方法 第一類 判斷程序是否存在,如果存在則直接退出。第二類 最簡單也是最準確的方法,用命名的互斥物件。如下 m hmutex 可以是成員變數,全域性變數或者是區域性變數 m hmutex createmutex null,false,t not imide if m hmutex 在呼叫 cr...

用C 給程式加啟動畫面並只允許乙個應用程式例項執行

涉及類 1 啟動畫面類 public class splashform system.windows.forms.form 以下省略 2 應用程式載入類 using system using system.drawing using system.collections using system.p...