?? 讓程序只運行一個實例(delphi篇) (2000年12月10.txt
字號:
讓程序只運行一個實例(Delphi篇) (2000年12月10日)
本站更新 分類: 作者:陳華珊 推薦: 閱讀次數:644
(http://www.codesky.net)
--------------------------------------------------------------------------------
Windows 下一個典型的特征就是多任務,我們可以同時打開多個窗口進行操作,也可以同時運行程序的多個實例,比如可以打開許多個資源管理器進行文件的移動復制操作。但有時出于某種考慮(比如安全性),我們要做出一些限制,讓程序只能夠運行一個實例。在Delphi編程中,筆者總結出了以下幾種方法:
一、 查找窗口法
這是最為簡單的一種方法。在程序運行前用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下通過。
作者:陳華珊
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -