delphi只允许运行一个实例

"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窗口中运行该程序,

此文来自: 马开东博客 转载请注明出处 网址: http://www.makaidong.com

将一次都不能运行,因为已经存在相同类名和标题的窗口:设计时的窗口。 

三、全局原子法

  我们也可以利用向系统添加全局原子的方法,来防止多个程序实例的运行。全局原子由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 只允许运行一个实例的三种方法转此文链接: http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E7%83%AD%E6%96%87/11617.shtml转载请注明出处: delphi 只允许运行一个实例的三种方法转 - 博客园

你可能感兴趣的:(delphi只允许运行一个实例)