如何防止乙個程式執行多次

2021-05-22 21:07:44 字數 1774 閱讀 6258

讓程式只執行乙個例項(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程式將會執行...