?? 讓程序只運(yùn)行一個(gè)實(shí)例(delphi篇) (2000年12月10.txt
字號(hào):
讓程序只運(yùn)行一個(gè)實(shí)例(Delphi篇) (2000年12月10日)
本站更新 分類: 作者:陳華珊 推薦: 閱讀次數(shù):644
(http://www.codesky.net)
--------------------------------------------------------------------------------
Windows 下一個(gè)典型的特征就是多任務(wù),我們可以同時(shí)打開(kāi)多個(gè)窗口進(jìn)行操作,也可以同時(shí)運(yùn)行程序的多個(gè)實(shí)例,比如可以打開(kāi)許多個(gè)資源管理器進(jìn)行文件的移動(dòng)復(fù)制操作。但有時(shí)出于某種考慮(比如安全性),我們要做出一些限制,讓程序只能夠運(yùn)行一個(gè)實(shí)例。在Delphi編程中,筆者總結(jié)出了以下幾種方法:
一、 查找窗口法
這是最為簡(jiǎn)單的一種方法。在程序運(yùn)行前用FindWindow函數(shù)查找具有相同窗口類名和標(biāo)題的窗口,如果找到了,就說(shuō)明已經(jīng)存在一個(gè)實(shí)例。在項(xiàng)目源文件的初始化部分添加以下代碼:
Program OneApp
Uses
Forms,Windows;(這里介紹的幾種方法均需在項(xiàng)目源文件中添加Windows單元,以后不再重復(fù)了)
Var Hwnd:Thandle;
Begin
Hwnd:=FindWindow(‘TForm1’,‘SingleApp’);
If Hwnd=0 then
Begin
Application.Initialize;
Application.CreateForm(Tform1, Form1);
Application.Run;
End;
End;
FindWindow()函數(shù)帶兩個(gè)參數(shù),其中的一個(gè)參數(shù)可以忽略,但筆者強(qiáng)烈建議將兩個(gè)參數(shù)都用上,免得湊巧別的程序也在使用相同的類名,就得不到正確的結(jié)果了。另外,如果是在Delphi IDE窗口中運(yùn)行該程序,將一次都不能運(yùn)行,因?yàn)橐呀?jīng)存在相同類名和標(biāo)題的窗口:設(shè)計(jì)時(shí)的窗體。
二、使用互斥對(duì)象
如果覺(jué)得查找窗口的方法效率不太高的話,可以使用創(chuàng)建互斥對(duì)象的方法。盡管互斥對(duì)象通常用于同步連接,但用在這個(gè)地方也是非常方便的。僅用了4句代碼就輕松搞定。
VAR Mutex:THandle;
begin
Mutex:=CreateMutex(NIL,True,‘SingleApp’);
IF GetLastError<>ERROR_ALREADY_EXISTS THEN//如果不存在另一實(shí)例
BEGIN
Application.CreateHandle;
Application.CreateForm (TExpNoteForm, ExpNoteForm);
Application.Run;
END;
ReleaseMutex(Mutex);
end.
三、全局原子法
我們也可以利用向系統(tǒng)添加全局原子的方法,來(lái)防止多個(gè)程序?qū)嵗倪\(yùn)行。全局原子由Windows 系統(tǒng)負(fù)責(zé)維持,它能保證其中的每個(gè)原子都是唯一的,管理其引用計(jì)數(shù),并且當(dāng)該全局原子的引用計(jì)數(shù)為0時(shí),從內(nèi)存中清除。我們用GlobalAddAtom 函數(shù)向全局原子添加一個(gè)255個(gè)字節(jié)以內(nèi)的字符串,用GlobalFindAtom來(lái)檢查是否已經(jīng)存在該全局原子,最后在程序結(jié)束時(shí)用GlobalDeleteAtom函數(shù)刪除添加的全局原子。示例如下:
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.
利用全局原子的引用計(jì)數(shù)規(guī)則,我們還可以判斷當(dāng)前共運(yùn)行了該程序的多少個(gè)實(shí)例:
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下通過(guò)。
作者:陳華珊
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -