如何用 CreateMutex 避免程式重複執行 ? |
缺席
|
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
如何用 CreateMutex 避免程式重複執行 ?
小弟用 "重複執行" 搜尋看過舊文章了 , 想用 CreateMutex 避免程式重複執行 ? ( FindWindows 似乎不是好做法) 小弟找到一個程式, 但是 Compile 有錯, 請問該如何修正 ? THX Project1.dpr program Project1; uses Forms, Unit1 in 'Unit1.pas' {Form1}; {$R *.res} begin Application.Initialize; if CreateMutex then // Undeclared identifier: CreateMutex, 該如何修正 ? begin Application.CreateForm(TForm1, Form1); Application.Run; end else DestroyMutex; end. ===================================================== Unit1.pas unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) // function CreateMutex: Boolean; // 錯誤 private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} var Mutex: hWnd; function CreateMutex: Boolean; var PrevInstHandle: THandle; AppTitle: PChar; begin AppTitle := StrAlloc(100); StrPCopy(AppTitle, Application.Title); Result := True; Mutex := Windows.CreateMutex(nil, False, AppTitle); if (GetLastError = ERROR_ALREADY_EXISTS) or (Mutex = 0) then begin Result := False; SetWindowText(Application.Handle, ''); PrevInstHandle := FindWindow(nil, AppTitle); if PrevInstHandle <> 0 then begin if IsIconic(PrevInstHandle) then ShowWindow(PrevInstHandle, SW_RESTORE) else BringWindowToTop(PrevInstHandle); SetForegroundWindow(PrevInstHandle); end; if Mutex <> 0 then Mutex := 0; end; StrDispose(AppTitle); end; procedure DestroyMutex; begin if Mutex <> 0 then CloseHandle(Mutex); end; end.
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問! |
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
找到一個可用的範例
修改 Project1.dpr 內容 program Project1; uses Forms, Windows, Unit1 in 'Unit1.pas' {Form1}; {$R *.res} var Mutex : THandle; begin Mutex := CreateMutex(nil, True, 'My_Unique_Application_Mutex_Name'); if (Mutex = 0) OR (GetLastError = ERROR_ALREADY_EXISTS) then begin // code to searh for, and activate // the previous (first) instance end else begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; if Mutex <> 0 then CloseHandle(Mutex); end; end.
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問! |
wpf
一般會員 發表:11 回覆:22 積分:6 註冊:2002-04-14 發送簡訊給我 |
|
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
小弟再提供一種方法
用程序 (process) 數量判斷是否重複執行函式 http://delphi.ktop.com.tw/board.php?cid=30&fid=72&tid=86113 ===================引 用 文 章=================== 隐约记得几年前用mutex 来控制 单例执行的时候,好像如果机器死机重起了,程序就再也启动不起来了,似乎是用mutex要保证程序正确退出,也许当初我用的不对吧
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問! |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |