【转】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程序只允许运行一个实例的三种方法:,布布扣,bubuko.com

时间: 2024-12-18 17:00:43

【转】delphi程序只允许运行一个实例的三种方法:的相关文章

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

方法一:使用线程互斥变量. 通过定义互斥变量来判断是否已运行实例.把program.cs文件里的Main()函数改为如下代码: using System; using System.Windows.Forms; using System.Runtime.InteropServices; namespace NetTools { static class Program { [DllImport("user32.dll")] private static extern bool Flas

C#应用程序只允许运行一个实例,多次运行的时候激活当前实例,显示其界面

很多时候,我们开发的程序,需要单例运行的的功能,即整个应用程序只允许同时运行最多一个实例,重复运行的时候,激活当前实力,显示其界面. 在C#程序中,其解决方案有多重,可以参照Charles Chen 的C#程序只允许运行一个实例的解决方案一文. 参照其文章,我决定使用调用Windows Api的方法,大致如下: namespace BarCodeSystem { public static class Program { /// <summary> /// Application Entry

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

最近在做winform的程序中,需要只能打开一个程序,如果已经存在,则激活该程序的窗口,并显示在最前端.在网上google了一哈,找到了很多的解决方案.这里我整理了3种方案,并经过了测试,现和朋友们分享: 一.使用用互斥量(System.Threading.Mutex) 同步基元,它只向一个线程授予对共享资源的独占访问权.在程序启动时候,请求一个互斥体,如果能获取对指定互斥的访问权,就职运行一个实例. 代码 bool createNew;            using (System.Thr

C#让应用程序只运行一个实例的几种方法

一 判断是否有相同的实例已经运行 1 根据“Mutex”判断是否有相同的实例在运行 /// <returns>已有实例运行返回true,否则为false</returns>public bool IsRunningProcessByMutex(){     bool createNew;     using (System.Threading.Mutex mutex = new System.Threading.Mutex(true, Application.ProductName

程序只启动一个实例的几种方法

我们在使用<金山词霸>时发现,在<金山词霸>已经运行了的情况下,再次点击<金山词霸>的图标,那么它不会再运行另外一个<金山词霸>,而是将已有的<金山词霸>给激活,始终只能运行一个<金山词霸>的实例. 在我们的程序当中如果要实现类似<金山词霸>的功能,就要解决两个问题,首先是要判断该程序已有一个实例在运行,其次是要将已运行的应用程序实例激活,同时退出第二个应用程序实例.  对于第一个问题,我们可以通过设置命名互斥对象或命名信

控制导航条最后一个标签样式的三种方法

<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>控制导航条最后一个标签样式的三种方法</title> <script src="http://ajax.aspnetcdn.com/ajax/jquery/jquery-2.1.1.min.js"></script> <style> .nav{

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

static class Program {   /// <summary>   /// 应用程序的主入口点.   /// </summary>   [STAThread]   static void Main()   {     Application.EnableVisualStyles();     Application.SetCompatibleTextRenderingDefault(false);     //1.这里判定是否已经有实例在运行     //只运行一个实

C# WinForm中如何让当前应用程序只允许启动一个实例

我们在WinForm开发中,很多情况下是需要只允许让用户运行一个实例,那么代码其实很简单.只需要修改Program.cs文件,代码如下 static class Program { /// <summary> /// 应用程序的主入口点. /// </summary> [STAThread] static void Main() { //Application.EnableVisualStyles(); //Application.SetCompatibleTextRenderin

Winform程序只允许运行一个程序实例

/// <summary> /// 应用程序的主入口点. /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); /* * 利用互斥变量来控制应用程序只能运行一个 */ bool bRun = true; va