綜述:讓乙個程式只執行乙個例項的方法有多種,但是原理都類似,也就是在程式建立前,有視窗的程式在視窗建立前,檢查系統中是否已經設定了某些特定標誌了,如果有說明已經有乙個例項在執行了,則當前程式通知使用者怎樣怎樣,然後程式退出,當然方法有這麼多,各自也就有自己的優缺點了。《注意下面的程式都是分塊拷貝的》
return nret;
}break;
case 1:
// 已存在程序,退出
case -1:// 無法建立,退出
default:
return false;
}方法二:
一般來說,使程式只執行乙個例項的最簡單的方法當然是使用findwindow()查詢主視窗,如果主視窗已經存在了,當然說明已經有乙個例項執行了。**如下:
// 這種方法有缺陷,視窗名字改變之後就再也找不到了,findwindow()的引數classname和caption比較難取得。
hwnd hwnd = findwindow(null, text("singleinstancefw"));
if(iswindow(hwnd))
方法三:
這種方法相比上面兩種方法,避免上面兩種方法的缺點,通過setprop()為程式主視窗設定乙個特殊的property,然後在啟動時遍歷所有的視窗,找出包含著個property的視窗局柄
。【這個附加的視窗屬性在視窗銷毀時也應該銷毀】這個方法的缺點就是**比較多一點,如下:
// 主視窗建立前判斷
hwnd oldhwnd = null;
::enumwindows(enumwndproc,(lparam)&oldhwnd); //列舉所有執行的視窗
if (oldhwnd != null)
方法四:
上面的方法二和方法三都有乙個弊病,不知道大家發現沒,那就是依賴於視窗的存在,沒有視窗的程式怎麼辦了,用方法一是可以的,不過方法一不太適合即時修改狀態,譬如我想提供選項給使用者,可以即時修改是否允許多例項,像kmp就提供了即時修改是否允許多例項,使用全域性變數是乙個比較好的解決方案,使用全域性共享變數的方法則主要是在vc框架程式中通過編譯器來實現的。通過#pragma data_seg預編譯指令建立乙個新節,在此節中可用volatile關鍵字定義乙個變數,而且必須對其進行初始化。volatile關鍵字指定了變數可以為外部程序訪問。最後,為了使該變數能夠在程序互斥過程中發揮作用,還要將其設定為共享變數,同時允許具有讀、寫訪問許可權。這可以通過#pragma comment預編譯指令來通知編譯器。下面給出使用了全域性變數的程序互斥**清單:
【注意,**應該放在程式的入口處】
其實上面的方法可以兩種進行組合來實現一些比較特殊的需求,具體怎樣就自己去想了。
讓程式只執行乙個例項(C )
通常我們會遇到這樣的情況,讓程式只執行乙個例項,比如啟動防毒軟體時,只能啟動乙個,再啟動的話就沒什麼效果!利用程式名來判斷不是乙個好辦法,如果我們把程式名稱改一下就可以執行兩個完全一樣的程序。我們最好利用程式集的attribute存放特定資訊,然後用assembly物件的getcustomattri...
讓程式只執行乙個例項(Delphi篇)
windows 下乙個典型的特徵就是多工,我們可以同時開啟多個視窗進行操作,也可以同時執行程式的多個例項,比如可以開啟許多個資源管理器進行檔案的移動複製操作。但有時出於某種考慮 比如安全性 我們要做出一些限制,讓程式只能夠執行乙個例項。在delphi程式設計中,筆者總結出了以下幾種方法 一 查詢視窗...
讓乙個元素垂直水平居中的四種方法
第一種方法 div.box weight 200px height 400px position absolute left 50 top 50 margin left 100px margin top 200px 相容性好 缺點 必須知道元素的寬高 第二種方法 div.box weight 200...