讓程式只執行乙個例項(Delphi篇)

2021-06-06 05:46:33 字數 2024 閱讀 8048

windows 下乙個典型的特徵就是多工,我們可以同時開啟多個視窗進行操作,也可以同時執行程式的多個例項,比如可以開啟許多個資源管理器進行檔案的移動複製操作。但有時出於某種考慮(比如安全性),我們要做出一些限制,讓程式只能夠執行乙個例項。在delphi程式設計中,筆者總結出了以下幾種方法: 

一、 查詢視窗法 

這是最為簡單的一種方法。在程式執行前用findwindow函式查詢具有相同視窗類名和標題的視窗,如果找到了,就說明已經存在乙個例項。在專案原始檔的初始化部分新增以下**: 

program

forms,windows;(這裡介紹的幾種方法均需在專案原始檔中新增windows單元,以後不再重複了) 

varhwnd:thandle; 

beginhwnd=0then

begin

end

findwindow()函式帶兩個引數,其中的乙個引數可以忽略,但筆者強烈建議將兩個引數都用上,免得湊巧別的程式也在使用相同的類名,就得不到正確的結果了。另外,如果是在delphi ide視窗中執行該程式,將一次都不能執行,因為已經存在相同類名和標題的視窗:設計時的窗體。 

二、使用互斥物件 

如果覺得查詢視窗的方法效率不太高的話,可以使用建立互斥物件的方法。儘管互斥物件通常用於同步連線,但用在這個地方也是非常方便的。僅用了4句**就輕鬆搞定。 

varmutex:thandle; 

begin

mutex:=createmutex(nil,truegetlasterror<>error_already_existsthen//如果不存在另一例項 

begin

releasemutex(mutex); 

end

三、全域性原子法 

我們也可以利用向系統新增全域性原子的方法,來防止多個程式例項的執行。全域性原子由windows 系統負責維持,它能保證其中的每個原子都是唯一的,管理其引用計數,並且當該全域性原子的引用計數為0時,從記憶體中清除。我們用globaladdatom 函式向全域性原子新增乙個255個位元組以內的字串,用globalfindatom來檢查是否已經存在該全域性原子,最後在程式結束時用globaldeleteatom函式刪除新增的全域性原子。示例如下: 

useswindows 

const

ifglobalfindatom(iatom)=0then

begin

else

messagebox(0,『you cannotrun a second copyof

利用全域性原子的引用計數規則,我們還可以判斷當前共執行了該程式的多少個例項: 

vari:integer; 

begin

i:=0; 

whileglobalfindatom(iatom)<>0do

begin

globaldeleteatom(globalfindatom(iatom)); 

i:=i+1; 

end

showmessage(inttostr(i)); 

end

以上幾種方法在筆者的delphi 4.0,中文windows95下通過。

讓程式只執行乙個例項(C )

通常我們會遇到這樣的情況,讓程式只執行乙個例項,比如啟動防毒軟體時,只能啟動乙個,再啟動的話就沒什麼效果!利用程式名來判斷不是乙個好辦法,如果我們把程式名稱改一下就可以執行兩個完全一樣的程序。我們最好利用程式集的attribute存放特定資訊,然後用assembly物件的getcustomattri...

C 讓應用程式只執行乙個例項

用如下方法可以保證應用程式只執行乙個例項。新增引用 using system.reflection using system.runtime.interopservices using system.diagnostics 呼叫dll檔案 dllimport user32.dll private s...

程式只執行乙個例項,並啟用前乙個例項

實現程式只執行一次的方法很多,但是原理都是一樣的,就是執行第一次的時候設定乙個標記,每次執行的時候檢查該標記,如果有就說明已經執行了。具體實現 1 在程式初始化的時候 initinstance 列舉所有的視窗,查詢本程式的例項是否存在 2 在主視窗初始化的時候在本視窗的屬性列表中新增乙個標記,以便程...