龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > VC开发 >

VC和Delphi程序只运行一个实例的方法(3)

时间:2009-12-30 15:42来源:未知 作者:admin 点击:
分享到:
{$R *.res} begin Application.Initialize; Application.CreateForm(TOnlyOneWindow, OnlyOneWindow); Application.Run; end. 我将其代码更改如下: program OnlyOne; uses Windows, Forms, uOnlyOneWindo

{$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:当某调用者所请求创建的互斥对象已经被命名了并且存在,这时这个调用者为“第二个调用者”。

精彩图集

赞助商链接