保证程序只运行一个实例(delphi)

        许多时候我们希望程序只有一个实例在运行,而不是多个实例同时运行。 其实完成这一功能有很多种方法,我把自己知道的几种方法简单介绍一下。
一  使用全局原子

  1. program Project1;
  2. uses
  3.   windows,
  4.   Forms,
  5.   Dialogs,
  6.   Unit1 in 'Unit1.pas' {Form1};
  7. {$R *.res}
  8. const
  9.   myatom='我的全局原子方法';
  10. begin
  11.   if GlobalFindAtom(myatom)=0 then
  12.   begin
  13.     GlobalAddAtom(myatom);
  14.     Application.Initialize;
  15.     Application.CreateForm(TForm1, Form1);
  16.     Application.Run;
  17.     GlobalDeleteAtom(GlobalFindAtom(myatom));
  18.   end
  19.   else
  20.     showmessage('已经有一个实例在运行');
  21. end.

二 使用互斥对象

  1. var
  2.   mymutex: THandle;
  3. begin
  4.   mymutex:=CreateMutex(nil,True,'我的互斥对象');
  5.   if GetLastError<>ERROR_ALREADY_EXISTS then
  6.   begin
  7.     Application.Initialize;
  8.     Application.CreateForm(TForm1, Form1);
  9.     Application.Run;
  10.   end
  11.   else
  12.     showmessage('已经有一个实例在运行');
  13. end.   

三 使用FindWindow函数

  1. var
  2.   myhandle: THandle;
  3. begin
  4.   myhandle:=FindWindow(nil,'Form1');
  5.   if myhandle=0 then
  6.   begin
  7.     Application.Initialize;
  8.     Application.CreateForm(TForm1, Form1);
  9.     Application.Run;
  10.   end
  11.   else
  12.     showmessage('已经有一个实例在运行');
  13. end.

        在上面介绍的几种方法中用到的 API函数GlobalFindAtom、GlobalAddAtom 、GlobalDeleteAtom、CreateMutex、GetLastError 、FindWindow 在msdn和delphi自带帮助的windows sdk中都有介绍。

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值