【转】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程序只允许运行一个实例的三种方法:的更多相关文章
- 解决C#程序只允许运行一个实例的几种方法详解
解决C#程序只允许运行一个实例的几种方法详解 本篇文章是对C#中程序只允许运行一个实例的几种方法进行了详细的分析介绍,需要的朋友参考下 本文和大家讲一下如何使用C#来创建系统中只能有该程序的一个实例运 ...
- 解决C# WINFORM程序只允许运行一个实例的几种方法详解
要实现程序的互斥,通常有下面几种方式,下面用 C# 语言来实现: 方法一: 使用线程互斥变量. 通过定义互斥变量来判断是否已运行实例. 把program.cs文件里的Main()函数改为如下代码: u ...
- C#程序只允许运行一个实例的解决方案
最近在做winform的程序中,需要只能打开一个程序,如果已经存在,则激活该程序的窗口,并显示在最前端.在网上google了一哈,找到了很多的解决方案.这里我整理了3种方案,并经过了测试,现和朋友们分 ...
- C#让应用程序只运行一个实例的几种方法
一 判断是否有相同的实例已经运行 1 根据“Mutex”判断是否有相同的实例在运行 /// <returns>已有实例运行返回true,否则为false</returns>pu ...
- python每次处理一个字符的三种方法
python每次处理一个字符的三种方法 a_string = "abccdea" print 'the first' for c in a_string: print ord(c) ...
- WinForm判断程序是否已经在运行,且只允许运行一个实例
我们开发WinFrom程序,很多时候都希望程序只有一个实例在运行,避免运行多个同样的程序,一是没有意义,二是容易出错. 为了更便于使用,笔者整理了一段自己用的代码,可以判断程序是否在运行,只运行一个实 ...
- C# WinForm中如何让当前应用程序只允许启动一个实例
我们在WinForm开发中,很多情况下是需要只允许让用户运行一个实例,那么代码其实很简单.只需要修改Program.cs文件,代码如下 static class Program { /// <s ...
- 总结PHP删除字符串最后一个字符的三种方法
一.前言 从数据库中select()读取一对多的信息时,经常需要将取出的数组用某个特定的字符分割,然后拼接成字符串. 常见的语法格式: foreach ($arr as $key => $val ...
- Winform程序只允许运行一个程序实例
/// <summary> /// 应用程序的主入口点. /// </summary> [STAThread] static void Main() { Application ...
随机推荐
- SublimeText3 生成html标签快捷键
mmet Documentation Syntax Child: > nav>ul>li <nav> <ul> <li></li> & ...
- jquery博客收集的IE6中CSS常见BUG全集及解决方案
今天的样式调的纠结,一会这边一会那么把jquery博客折腾的头大,浏览器兼容性.晚上闲着收集一些常见IE6中的BUG 3像素问题及解决办法 当使用float浮动容器后,在IE6下会产生3px的空隙,有 ...
- 如何利用phpize在生产环境中为php添加新的扩展php-bcmath
在日常的开发当中,随着开发的功能越来越复杂.对运行环境的要求也就随着需求的变化需要不断地更新和变化.一个在线的生产系统不可能一开始就满足了所有的运行依赖,因此动态地添加依赖就显得比较必要了.如果你的应 ...
- Java面向对象的封装
封装是Java面向对象的三大特性之一,通常我们是通过包管理机制同时对类进行封装,隐藏其内部实现细节,通常开发中不允许直接操作类中的成员属性,所以属性一般设置为私有权限private,类中一般会给出一些 ...
- FastReport安装说明(中文版)
FastReport安装说明(中文版) 内容列表 I. IntroductionI. 介绍II. Manual installing of the FastReport packagesII. 手动安 ...
- VS2010中“工具>选项中的VC++目录编辑功能已被否决”解决方法
转自:http://blog.csdn.net/chaijunkun/article/details/6658923 这是VS2010的改变,不能够在“工具-选项”中看到“VC++目录”了. 但是呢, ...
- Babelfish(poj 2503)
大致题意: 输入一个字典,字典格式为“英语à外语”的一一映射关系 然后输入若干个外语单词,输出他们的 英语翻译单词,如果字典中不存在这个单词,则输出“eh” #include<iostream& ...
- 解决ubuntu14.04下Qt 5.3.1下的QtCreator fcitx,ibus不能输入中文
http://my.oschina.net/u/219482/blog/341452 感谢作者 ubuntu 14.04从Qt官网下载的最新版qt,安装过程很顺利,但却发现没办法输入中文(我用的是 f ...
- php 面向对象的方式访问数据库
<body> <?php //面向对象的方式访问数据库 //造对象 $db = new MySQLi("localhost","root",& ...
- php封装练习
<body> <?php class jisuan { private $a; private $b; function __construct($a,$b) { $this-> ...