一、创建互斥对象

在工程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 只允许运行一个实例的三种方法《转》相关推荐

  1. 解决C#程序只允许运行一个实例的几种方法详解

    解决C#程序只允许运行一个实例的几种方法详解 参考文章: (1)解决C#程序只允许运行一个实例的几种方法详解 (2)https://www.cnblogs.com/randyzhuwei/p/5403 ...

  2. 转:让程序只运行一个实例的四种方法

    先留着以后有用. 让程序只运行一个实例的四种方法 综述:让一个程序只运行一个实例的方法有多种,但是原理都类似,也就是在程序创建前,有窗口的程序在窗口创建前,检查系统中是否已经设置了某些特定标志了,如果 ...

  3. android stringbuilder清空,StringBuffer 清空StringBuffer的实例的三种方法

    @Test public void testStringbuffer(){ //StringBuffer类没有clear方法,不过可以通过下面两种方法来清空一个StringBuffer的实例: Str ...

  4. php 去掉后导字符,PHP去除字符串最后一个字符的三种方法实例

    前言 本文讲讲PHP中如何正确的去除字符串中的最后一个字符,之前跟大家分享过一篇关于PHP去除字符串最后一个字符的三种方法的文章,但是没给出实例,下面话不多说,直接上代码,相信一眼就能看出来了,直接将 ...

  5. 禁止手机侧滑返回上一个页面的三种方法

    禁止手机侧滑返回上一个页面的三种方法 侧滑返回上一个页面用户体验很很好.但是在特别的场景侧滑返回上一个页面严重影响用户体验: 1.如正在斗地主,结果在出牌时,由于出最左边的牌时,不小心触发了侧滑离开斗 ...

  6. C#程序只允许运行一个实例的解决方案

    最近在做winform的程序中,需要只能打开一个程序,如果已经存在,则激活该程序的窗口,并显示在最前端.在网上google了一哈,找到了很多的解决方案.这里我整理了3种方案,并经过了测试,现和朋友们分 ...

  7. C# WinForm 判断程序是否已经在运行,且只允许运行一个实例,附源码

    2019独角兽企业重金招聘Python工程师标准>>> 我们开发WinFrom程序,很多时候都希望程序只有一个实例在运行,避免运行多个同样的程序,一是没有意义,二是容易出错.为了更便 ...

  8. C# WinForm 判断程序是否已经在运行,且只允许运行一个实例

    static class Program {   /// <summary>   /// 应用程序的主入口点.   /// </summary>   [STAThread]   ...

  9. Shell 脚本调用另一个脚本的三种方法

    文章目录 1.source 2.点号. 3.sh 命令 4.三者的区别 5.export 命令设置临时环境变量 6.export 命令设置永久环境变量 参考文献 假如有脚本 first.sh: #!/ ...

最新文章

  1. 【边缘计算】边缘计算元年一文看懂云边协同!九大场景带来新一轮信息革命...
  2. 利用脚本将文字插入到图片或进行多个图片拼接
  3. 安装mysql error 1045_安装MySQL出现1045错误
  4. 无人职守安装的设计与部署
  5. ASP.NET Core 认证与授权[4]:JwtBearer认证
  6. 毕业就业推荐表计算机,毕业生就业推荐表
  7. VUE 2 无法监听数组和对象的某些变化
  8. 移动开发—媒体查询(Media Query)
  9. vue学习项目之去哪儿网笔记
  10. VS2017如何创建c语言项目
  11. 6.Nginx静态代理
  12. c语言 char * 遍历,使用指针遍历char数组
  13. mysql ndb是什么_MySQL NDB Cluster介绍
  14. 网站建设需要网站服务器吗
  15. java-multimap使用
  16. 考文垂鹰摩托车的历史
  17. 什么是数据结构,都有哪些数据结构
  18. 知识图谱基础知识之三——知识图谱的构建过程
  19. linux格式化提示分区被占用,无法格式化D盘提示被占用要怎么解决?D盘无法格式化被占用解决教程...
  20. CustomerList

热门文章

  1. Java多线程相关知识
  2. CentOS 6 同一台机器部署多个Tomcat应用服务器
  3. J2EE Java泛型的好处
  4. WordPress 2.9.2 使用感受
  5. Nginx 路由--Location的使用
  6. Web安全测试检查单
  7. 【python】命令行解析工具getopt用法
  8. linux开启远程访问端口
  9. Hibernate关联关系映射
  10. js 删除数组几种方法