讓程式只執行乙個例項(delphi篇)
windows 下乙個典型的特徵就是多工,我們可以同時開啟多個視窗進行操作,也可以同時執行程式的多個例項,比如可以開啟許多個資源管理器進行檔案的移動複製操作。但有時出於某種考慮(比如安全性),我們要做出一些限制,讓程式只能夠執行乙個例項。在delphi程式設計中,筆者總結出了以下幾種方法:
一、查詢視窗法
這是最為簡單的一種方法。在程式執行前用findwindow函式查詢具有相同視窗類名和標題的視窗,如果找到了,就說明已經存在乙個例項。在專案原始檔的初始化部分新增以下**:
program checknettool;
uses
forms,
windows,
messages,
sysutils,
mainfrm in 'mainfrm.pas' ;
varmhandle: hwnd;
begin
mhandle := findwindow('tmainform', '網路檢測');
if mhandle <> 0 then
sendmessage(mhandle, sw_show, 1, 0)
else
begin
end
end.
findwindow()函式帶兩個引數,其中的乙個引數可以忽略,但筆者強烈建議將兩個引數都用上,免得湊巧別的程式也在使用相同的類名,就得不到正確的結果了。另外,如果是在delphi ide視窗中執行該程式,將一次都不能執行,因為已經存在相同類名和標題的視窗:設計時的窗體。
二、使用互斥物件
如果覺得查詢視窗的方法效率不太高的話,可以使用建立互斥物件的方法。儘管互斥物件通常用於同步連線,但用在這個地方也是非常方便的。
program checknettool;
uses
forms,
windows,
mainfrm in 'mainfrm.pas' ;
varfmutex: hwnd;
begin
fmutex := createmutex(nil, true, '網路檢測');
if getlasterror <> error_already_exists then
begin
end
else
releasemutex(fmutex);
closehandle(fmutex);
end.
三、全域性原子法
我們也可以利用向系統新增全域性原子的方法,來防止多個程式例項的執行。全域性原子由windows系統負責維持,它能保證其中的每個原子都是唯一的,管理其引用計數,並且當該全域性原子的引用計數為0時,從記憶體中清除。我們用globaladdatom函式向全域性原子新增乙個255個位元組以內的字串,用globalfindatom來檢查是否已經存在該全域性原子,最後在程式結束時用globaldeleteatom函式刪除新增的全域性原子。示例如下:
program checknettool;
uses
forms,
windows,
mainfrm in 'mainfrm.pas' ;
begin
if globalfindatom(fatom) = 0 then
begin
globaladdatom(fatom);
globaldeleteatom(globalfindatom(fatom));
endelse
end.
Delphi 防止程式多次執行
program project1 uses forms,windows,unit1 in unit1.pas var hmutex hwnd ret integer begin hmutex createmutex nil,false,test ret getlasterror if ret err...
C 防止程式多次執行
經過我的測試,還比較好用,但是有個問題,如果不登出,用另乙個使用者進入,則程式不能判斷出已執行。所以只限於用在單使用者環境,還是不太完美。class program console.writeline 正在執行中 console.readline public static class oneins...
C 開發技巧 如何防止程式多次執行
最近發現很多人在論壇中問到如何防止程式被多次執行的問題的,如 所以這裡就記錄下來,希望給遇到同樣問題的朋友有所參考的,同時也是對自己的乙個積累。在介紹具體實現 之前,我們必須明確解決這個問題的思路是什麼的?下面只要分享我的乙個思考的這個問題的方式 當我們點選乙個exe檔案時,此時該exe程式將會執行...