"delphi 只允许运行一个实例的三种方法转":
搜索此文相关文章: delphi 只允许运行一个实例的三种方法转此文链接: http://www.makaidong.com/%E5%8D%9A%E5%AE%A2%E5%9B%AD%E7%83%AD%E6%96%87/11617.shtml转载请注明出处: 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 只允许运行一个实例的三种方法转 - 博客园