windows是多程序作業系統,框架生成的應用程式可以多次執行,形成多個執行例項。但在有些情況下為保證應用程式的安全執行,要求程式
只能執行乙個例項,比如程式要
使用只能被乙個程序單獨使用的特殊硬體(例如數據機)時,必須限制程式只執行乙個例項。
這裡涉及兩個基本的問題:一是在程式的第二個例項啟動時,如何發現該程式已有乙個例項在執行;二是如何將第乙個例項啟用,而使
第二個
例項退出。
對於第乙個問題,可以通過給應用程式設定互斥量/訊號量,例項啟動時首先檢測該訊號量,如已存在,則說明程式已執行乙個例項。第二個問
題的難點是獲取第乙個例項的主
窗物件指標或控制代碼,然後便可用setforegroundwindow來啟用。雖然findwindow函式能尋找正執行著的窗
口,但該函式要求指明所尋找視窗的標題或視窗類名,不是實現通
用方法的途徑。我們可以用win 32 sdk函式setprop來給應用程式主窗設
置乙個特有的標記。用getdesktopwindow可以獲取windows系
統主控視窗物件指標或控制代碼,所有
應用程式主窗都可看成該視窗的子視窗,
即可用getwindow函式來獲得它們的物件指標或控制代碼。用win 32
sdk函式getprop查詢每一應用程式主窗是否包含有我們設定的特
定標記
便可確定它是否我們要尋找的第乙個例項主窗。使第二個例項退出很
簡單,只要讓其應用程式物件的initinstance函式返回false即
可。此
外,當主視窗退出時,應用
removeprop函式刪除我們為其設定的標記。
::setforegroundwindow(hpre);
::setforegroundwindow(::getlastactivepopup(hpre));
returnfalse;
}
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...