讓程式只運行一個執行個體

來源:互聯網
上載者:User

標籤: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下通過。

讓程式只運行一個執行個體

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.