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


本文整理自网络,侵删。

  

一、创建互斥对象

在工程project1.dpr中创建互斥对象

Program project1

Uses

Windows,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)) then

begin   // 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

  Uses

Forms,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.

相关阅读 >>

Delphi 将base64字符串转化为jpeg图片

Delphi edit1.gettextlen 获取编辑框字符数

Delphi读取excel文件-统计全部工作表中内容相同单元格出现次数

Delphi setwindowshookex - 设置钩子 unhookwindowshookex - 卸掉钩子

Delphi 中的文件系统进行unicode标准化

Delphi检测程序内存泄漏

Delphi indy 10tidftp中的directorylisting使用

Delphi xe5 android 捕获几个事件

Delphi 只限制到4位小数级别

Delphi 如何将access数据库后缀名accdb改为mdb

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...