许多时候我们希望程序只有一个实例在运行,而不是多个实例同时运行。 其实完成这一功能有很多种方法,我把自己知道的几种方法简单介绍一下。
一 使用全局原子
- program Project1;
- uses
- windows,
- Forms,
- Dialogs,
- Unit1 in 'Unit1.pas' {Form1};
- {$R *.res}
- const
- myatom='我的全局原子方法';
- begin
- if GlobalFindAtom(myatom)=0 then
- begin
- GlobalAddAtom(myatom);
- Application.Initialize;
- Application.CreateForm(TForm1, Form1);
- Application.Run;
- GlobalDeleteAtom(GlobalFindAtom(myatom));
- end
- else
- showmessage('已经有一个实例在运行');
- end.
二 使用互斥对象
- var
- mymutex: THandle;
- begin
- mymutex:=CreateMutex(nil,True,'我的互斥对象');
- if GetLastError<>ERROR_ALREADY_EXISTS then
- begin
- Application.Initialize;
- Application.CreateForm(TForm1, Form1);
- Application.Run;
- end
- else
- showmessage('已经有一个实例在运行');
- end.
三 使用FindWindow函数
- var
- myhandle: THandle;
- begin
- myhandle:=FindWindow(nil,'Form1');
- if myhandle=0 then
- begin
- Application.Initialize;
- Application.CreateForm(TForm1, Form1);
- Application.Run;
- end
- else
- showmessage('已经有一个实例在运行');
- end.
在上面介绍的几种方法中用到的 API函数GlobalFindAtom、GlobalAddAtom 、GlobalDeleteAtom、CreateMutex、GetLastError 、FindWindow 在msdn和delphi自带帮助的windows sdk中都有介绍。