同理,這個方法適用於所有的原生Win32應用程序,能夠正常調用GreateMutex和GetLastError兩個函數即可,Delphi程序(這次是一個帶有窗口的程序)可以參考以下步驟和代碼:
在Delphi中建立一個應用程序,然後單擊菜單“Project”,單擊“VIEw Source”,這樣就在代碼編輯器中打開了工程文件,它的代碼看起來像這樣:
program OnlyOne;
uses
Forms,
uOnlyOneWindow in 'uOnlyOneWindow.pas' {OnlyOneWindow };
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(TOnlyOneWindow, OnlyOneWindow);
Application.Run;
end.
我將其代碼更改如下:
program OnlyOne;
uses
Windows,
Forms,
uOnlyOneWindow in 'uOnlyOneWindow.pas' {OnlyOneWindow};
{$R *.res}
var
hAppMutex: THandle;
begin
Application.Initialize;
//創建互斥對象
hAppMutex := CreateMutex(nil, false, PChar('OnlyOne'));
if (hAppMutex = 0) then
begin
MessageBox(0,PChar('創建互斥對象失敗!'),PChar('Error'),MB_OK + MB_ICONINFORMATION);
exit;
end;
//查看是否是第一次運行程序
if ((hAppMutex <> 0) and (GetLastError() = ERROR_ALREADY_EXISTS)) then
begin
MessageBox(0,PChar('不是第一次運行這個程序!'),PChar('OK'),MB_OK + MB_ICONINFORMATION);
//關閉互斥對象,退出程序
CloseHandle(hAppMutex);
exit;
end;
Application.CreateForm(TOnlyOneWindow, OnlyOneWindow);
Application.Run;
//關閉互斥對象
CloseHandle(hAppMutex);
end.
注意:
1.在User中,要把Windows放在Form前頭;
2.開始創建互斥對象的代碼要在Application.Initialize之後;
3.關閉互斥對象操作要放在Application.Run之後;
這樣,我們只用了較少的代碼和較少的系統資源消耗就實現了應用程序檢測自己是否被多次運行,從而保證只運行一個示例這樣的效果。
以上程序在Visual C++ 6.0(SP6)、Delphi 7(Build 8.1)中編譯,在Windows XP SP2中測試通過。
注1:當某調用者所請求創建的互斥對象已經被命名了並且存在,這時這個調用者為“第二個調用者”。