您的位置:首页 > 其它

只允许运行一个实例的三种方法

2013-06-24 13:56 351 查看
一、创建互斥对象在工程project1.dpr中创建互斥对象Program project1UsesWindows,Form,FrmMain in 'FrmMain.pas' {MainForm};{$R *.res}var
hAppMutex: THandle; //声明互斥变量begin     hAppMutex := CreateMutex(nil, false,’projectname’); //创建互斥对象projectname工程名称      if ( (hAppMutex <> 0) and (GetLastError() = ERROR_ALREADY_EXISTS)) thenbegin   // hAppMutex <> 0 说明互斥对象创建成功        MessageBox('程序已经运行, 按确定关闭此窗口!','提示!', MB_OK);   end    else    begin       Application.InInitialize;       Application.CreateForm(TMainForm, MainForm);      Application.Run;   end;ReleaseMutex(hAppMutex); //关闭互斥体 CloseHandle(hAppMutex)作用一样end.                                                                                                                                                                                                                                                                                                                                                                                                       二、查找窗口法这是最为简单的一种方法。在程序运行前用FindWindow函数查找具有相同窗口类名和标题的窗口,如果找到了,就说明已经存在在项目源文件的初始化部分添加以下代码:  Program Project1  UsesForms,Windows;Var Hwnd:Thandle;  Begin   Hwnd:=FindWindow(‘TForm1’,’Form1’);   If Hwnd=0 then   Begin       Application.Initialize;       Application.CreateForm(Tform1, Form1);     Application.Run;   End          Else         Application.MessageBox(pchar('此程序已经运行!'),pchar('提示!'),MB_OK);      End; FindWindow()函数带两个参数(类名和标题的窗口)其中的一个参数可以忽略,但笔者强烈建议将两个参数都用上,免得凑巧别的程序也在使用相同的类名,就得不到正确的结果了。另外,如果是在Delphi IDE窗口中运行该程序,将一次都不能运行,因为已经存在相同类名和标题的窗口:设计时的窗口。                                                                                                                                                                                                                                                                                      三、全局原子法  我们也可以利用向系统添加全局原子的方法,来防止多个程序实例的运行。全局原子由Windows 系统负责维持,它能保证其中的每个原子都是唯一的,管理其引用计数,并且当该全局原子的引用计数为0时,从内存中清除。我们用GlobalAddAtom 函数向全局原子添加一个255个字节以内的字符串,用GlobalFindAtom来检查是否已经存在该全局原子,最后在程序结束时用GlobalDeleteAtom函数删除添加的全局原子。示例如下:    Program project1     Uses Windows,Froms,       Unit1 in 'Unit1.pas' {Form1},     const iAtom=‘application’; //可以是任意一个唯一标示该程序的原子量  begin   if GlobalFindAtom(iAtom)=0 then   begin      GlobalAddAtom(iAtom); //添加全局原子      Application.Initialize;      Application.CreateForm(TForm1,Form1);      Application.Run;      GlobalDeleteAtom(GlobalFindAtom(iAtom));//删除添加的全局原子   end   else   Application.MessageBox(pchar('此程序已经运行!'),pchar('提示!'),MB_OK);  end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: