delphi 只允许运行一个实例的三种方法《转》
一、创建互斥对象
在工程project1.dpr中创建互斥对象
Program project1UsesWindows,Form,FrmMain in 'FrmMain.pas' {MainForm};{$R *.res}varhAppMutex: THandle; //声明互斥变量beginhAppMutex := CreateMutex(nil, false,’projectname’); //创建互斥对象projectname工程名称if ( (hAppMutex <> 0) and (GetLastError() = ERROR_ALREADY_EXISTS)) thenbegin // hAppMutex <> 0 说明互斥对象创建成功MessageBox('程序已经运行, 按确定关闭此窗口!','提示!', MB_OK);endelsebeginApplication.InInitialize;Application.CreateForm(TMainForm, MainForm);Application.Run;end;ReleaseMutex(hAppMutex); //关闭互斥体 CloseHandle(hAppMutex)作用一样end.
二、查找窗口法
这是最为简单的一种方法。在程序运行前用FindWindow函数查找具有相同窗口类名和标题的窗口,如果找到了,就说明已经存在
在项目源文件的初始化部分添加以下代码:
Program Project1UsesForms,Windows;Var Hwnd:Thandle;BeginHwnd:=FindWindow(‘TForm1’,’Form1’);If Hwnd=0 thenBeginApplication.Initialize;Application.CreateForm(Tform1, Form1);Application.Run;EndElseApplication.MessageBox(pchar('此程序已经运行!'),pchar('提示!'),MB_OK);End;
FindWindow()函数带两个参数(类名和标题的窗口)其中的一个参数可以忽略,但笔者强烈建议将两个参数都用上,免得凑巧别的程序也在使用相同的类名,就得不到正确的结果了。
另外,如果是在Delphi IDE窗口中运行该程序,将一次都不能运行,因为已经存在相同类名和标题的窗口:设计时的窗口。
三、全局原子法
我们也可以利用向系统添加全局原子的方法,来防止多个程序实例的运行。全局原子由Windows 系统负责维持,它能保证其中的每个原子都是唯一的,管理其引用计数,并且当该全局原子的引用计数为0时,从内存中清除。我们用GlobalAddAtom 函数向全局原子添加一个255个字节以内的字符串,用GlobalFindAtom来检查是否已经存在该全局原子,最后在程序结束时用GlobalDeleteAtom函数删除添加的全局原子。示例如下:
Program project1Uses Windows,Froms,Unit1 in 'Unit1.pas' {Form1},const iAtom=‘application’; //可以是任意一个唯一标示该程序的原子量beginif GlobalFindAtom(iAtom)=0 thenbeginGlobalAddAtom(iAtom); //添加全局原子Application.Initialize;Application.CreateForm(TForm1,Form1);Application.Run;GlobalDeleteAtom(GlobalFindAtom(iAtom));//删除添加的全局原子endelseApplication.MessageBox(pchar('此程序已经运行!'),pchar('提示!'),MB_OK); end.
转载于:https://www.cnblogs.com/LceMeaning/p/3426986.html
delphi 只允许运行一个实例的三种方法《转》相关推荐
- 解决C#程序只允许运行一个实例的几种方法详解
解决C#程序只允许运行一个实例的几种方法详解 参考文章: (1)解决C#程序只允许运行一个实例的几种方法详解 (2)https://www.cnblogs.com/randyzhuwei/p/5403 ...
- 转:让程序只运行一个实例的四种方法
先留着以后有用. 让程序只运行一个实例的四种方法 综述:让一个程序只运行一个实例的方法有多种,但是原理都类似,也就是在程序创建前,有窗口的程序在窗口创建前,检查系统中是否已经设置了某些特定标志了,如果 ...
- android stringbuilder清空,StringBuffer 清空StringBuffer的实例的三种方法
@Test public void testStringbuffer(){ //StringBuffer类没有clear方法,不过可以通过下面两种方法来清空一个StringBuffer的实例: Str ...
- php 去掉后导字符,PHP去除字符串最后一个字符的三种方法实例
前言 本文讲讲PHP中如何正确的去除字符串中的最后一个字符,之前跟大家分享过一篇关于PHP去除字符串最后一个字符的三种方法的文章,但是没给出实例,下面话不多说,直接上代码,相信一眼就能看出来了,直接将 ...
- 禁止手机侧滑返回上一个页面的三种方法
禁止手机侧滑返回上一个页面的三种方法 侧滑返回上一个页面用户体验很很好.但是在特别的场景侧滑返回上一个页面严重影响用户体验: 1.如正在斗地主,结果在出牌时,由于出最左边的牌时,不小心触发了侧滑离开斗 ...
- C#程序只允许运行一个实例的解决方案
最近在做winform的程序中,需要只能打开一个程序,如果已经存在,则激活该程序的窗口,并显示在最前端.在网上google了一哈,找到了很多的解决方案.这里我整理了3种方案,并经过了测试,现和朋友们分 ...
- C# WinForm 判断程序是否已经在运行,且只允许运行一个实例,附源码
2019独角兽企业重金招聘Python工程师标准>>> 我们开发WinFrom程序,很多时候都希望程序只有一个实例在运行,避免运行多个同样的程序,一是没有意义,二是容易出错.为了更便 ...
- C# WinForm 判断程序是否已经在运行,且只允许运行一个实例
static class Program { /// <summary> /// 应用程序的主入口点. /// </summary> [STAThread] ...
- Shell 脚本调用另一个脚本的三种方法
文章目录 1.source 2.点号. 3.sh 命令 4.三者的区别 5.export 命令设置临时环境变量 6.export 命令设置永久环境变量 参考文献 假如有脚本 first.sh: #!/ ...
最新文章
- 【边缘计算】边缘计算元年一文看懂云边协同!九大场景带来新一轮信息革命...
- 利用脚本将文字插入到图片或进行多个图片拼接
- 安装mysql error 1045_安装MySQL出现1045错误
- 无人职守安装的设计与部署
- ASP.NET Core 认证与授权[4]:JwtBearer认证
- 毕业就业推荐表计算机,毕业生就业推荐表
- VUE 2 无法监听数组和对象的某些变化
- 移动开发—媒体查询(Media Query)
- vue学习项目之去哪儿网笔记
- VS2017如何创建c语言项目
- 6.Nginx静态代理
- c语言 char * 遍历,使用指针遍历char数组
- mysql ndb是什么_MySQL NDB Cluster介绍
- 网站建设需要网站服务器吗
- java-multimap使用
- 考文垂鹰摩托车的历史
- 什么是数据结构,都有哪些数据结构
- 知识图谱基础知识之三——知识图谱的构建过程
- linux格式化提示分区被占用,无法格式化D盘提示被占用要怎么解决?D盘无法格式化被占用解决教程...
- CustomerList