delphi只允許執行一個例項
阿新 • • 發佈:2019-02-07
"delphi 只允許執行一個例項的三種方法轉":
搜尋此文相關文章:delphi 只允許執行一個例項的三種方法轉此文連結:http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E7%83%AD%E6%96%87/11617.shtml轉載請註明出處: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)) thenbegin // 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 只允許執行一個例項的三種方法轉 - 部落格園