1. 程式人生 > >delphi只允許執行一個例項

delphi只允許執行一個例項

"delphi 只允許執行一個例項的三種方法轉":

一、建立互斥物件

在工程project1.dpr中建立互斥物件

program project1

uses

windows,form,

frmmain in 'frmmain.pas' {mainform};

        {$r *.res}

    var

    happmutex: thandle; //宣告互斥變數

   begin

     happmutex := createmutex(nil, false,’projectname’); //建立互斥物件projectname工程名稱

      if ( (happmutex <> 0) and (getlasterror() = error_already_exists)) then
begin // happmutex <> 0 說明互斥物件建立成功 messagebox('程式已經執行, 按確定關閉此視窗!','提示!', mb_ok); end else begin application.ininitialize; application.createform(tmainform, mainform); application.run; end; releasemutex(happmutex); //關閉互斥體 closehandle(happmutex)作用一樣
end.

二、查詢視窗法

這是最為簡單的一種方法。在程式執行前用findwindow函式查詢具有相同視窗類名和標題的視窗,如果找到了,就說明已經存在

在專案原始檔的初始化部分新增以下程式碼:

program project1

uses

forms,windows;

var hwnd:thandle;

  begin

   hwnd:=findwindow(‘tform1’,’form1’);

   if hwnd=0 then

   begin

       application.initialize;

       application.createform(tform1, form1);

     application.run;

   end

          else

         application.messagebox(pchar(
'此程式已經執行!'),pchar('提示!'),mb_ok); end;

findwindow()函式帶兩個引數(類名和標題的視窗)其中的一個引數可以忽略,但筆者強烈建議將兩個引數都用上,免得湊巧別的程式也在使用相同的類名,就得不到正確的結果了。

另外,如果是在delphi ide視窗中執行該程式,

將一次都不能執行,因為已經存在相同類名和標題的視窗:設計時的視窗。 

三、全域性原子法

  我們也可以利用向系統新增全域性原子的方法,來防止多個程式例項的執行。全域性原子由windows 系統負責維持,它能保證其中的每個原子都是唯一的,管理其引用計數,並且當該全域性原子的引用計數為0時,從記憶體中清除。我們用globaladdatom 函式向全域性原子新增一個255個位元組以內的字串,用globalfindatom來檢查是否已經存在該全域性原子,最後在程式結束時用globaldeleteatom函式刪除新增的全域性原子。示例如下:

    program project1

     uses windows,froms,

       unit1 in 'unit1.pas' {form1},

     const iatom=‘application’; //可以是任意一個唯一標示該程式的原子量

  begin

   if globalfindatom(iatom)=0 then

   begin

      globaladdatom(iatom); //新增全域性原子

      application.initialize;

      application.createform(tform1,form1);

      application.run;

      globaldeleteatom(globalfindatom(iatom));//刪除新增的全域性原子

   end

   else

   application.messagebox(pchar('此程式已經執行!'),pchar('提示!'),mb_ok);  

end.

搜尋此文相關文章:delphi 只允許執行一個例項的三種方法轉此文連結:http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E7%83%AD%E6%96%87/11617.shtml轉載請註明出處:delphi 只允許執行一個例項的三種方法轉 - 部落格園