標籤:io os 使用 ar for 檔案 代碼 on c
Windows 下一個典型的特徵就是多任務,我們可以同時開啟多個視窗進行操作,也可以
同時運行程式的多個執行個體,比如可以開啟許多個資源管理員進行檔案的移動複製操作。但有
時出於某種考慮(比如安全性),我們要做出一些限制,讓程式只能夠運行一個執行個體。在De
lphi編程中,筆者總結出了以下幾種方法:
一、 尋找視窗法
這是最為簡單的一種方法。在程式運行前用FindWindow函數尋找具有相同視窗類別名和標
題的視窗,如果找到了,就說明已經存在一個執行個體。在項目源檔案的初始化部分添加以下代
碼:
Program OneApp
Uses
Forms,Windows;(這裡介紹的幾種方法均需在項目源檔案中添加Windows單元,以後不再重複了)
Var
Hwnd:Thandle;
Begin
Hwnd:=FindWindow(‘TForm1‘,‘SingleApp‘);
If Hwnd=0 then
Begin
Application.Initialize;
Application.CreateForm(Tform1, Form1);
Application.Run;
End;
End;
FindWindow()函數帶兩個參數,其中的一個參數可以忽略,但筆者強烈建議將兩個參數
都用上,免得湊巧別的程式也在使用相同的類名,就得不到正確的結果了。另外,如果是在
Delphi IDE視窗中運行該程式,將一次都不能運行,因為已經存在相同類名和標題的視窗:
設計時的表單。
二、使用互斥對象
如果覺得尋找視窗的方法效率不太高的話,可以使用建立互斥對象的方法。儘管互斥對
象通常用於同步串連,但用在這個地方也是非常方便的。僅用了4句代碼就輕鬆搞定。
var
Mutex:THandle;
begin
Mutex:=CreateMutex(NIL,True,‘SingleApp‘);
if GetLastError<>ERROR_ALREADY_EXISTS then //如果不存在另一執行個體
begin
Application.CreateHandle;
Application.CreateForm (TExpNoteForm, ExpNoteForm);
Application.Run;
end;
ReleaseMutex(Mutex);
end.
三、全域原子法
我們也可以利用向系統添加全域原子的方法,來防止多個程式執行個體的運行。全域原子由
Windows 系統負責維持,它能保證其中的每個原子都是唯一的,管理其引用計數,並且當該
全域原子的引用計數為0時,從記憶體中清除。我們用GlobalAddAtom 函數向全域原子添加一個
255個位元組以內的字串,用GlobalFindAtom來檢查是否已經存在該全域原子,最後在程式結
束時用GlobalDeleteAtom函數刪除添加的全域原子。樣本如下:
Uses
Windows;
const iAtom=‘SingleApp‘;
begin
if GlobalFindAtom(iAtom)=0 then
begin
GlobalAddAtom(iAtom);
Application.Initialize;
Application.CreateForm(TForm1,Form1);
Application.Run;
GlobalDeleteAtom(GlobalFindAtom(iAtom));
end
else
MessageBox(0,‘You can not run a second copy of this App‘, ‘‘ ,mb_OK);
end.
利用全域原子的引用計數規則,我們還可以判斷當前共運行了該程式的多少個執行個體:
var
i:Integer;
begin
i:=0;
while GlobalFindAtom(iAtom)<>0 do
begin
GlobalDeleteAtom(GlobalFindAtom(iAtom));
i:=i+1;
end;
ShowMessage(IntToStr(I));
end;
以上幾種方法在筆者的Delphi 4.0,中文Windows95下通過。
讓程式只運行一個執行個體