程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 如何讓VC和Delphi程序只運行一個實例(3)

如何讓VC和Delphi程序只運行一個實例(3)

編輯:Delphi

同理,這個方法適用於所有的原生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:當某調用者所請求創建的互斥對象已經被命名了並且存在,這時這個調用者為“第二個調用者”。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved