zoukankan      html  css  js  c++  java
  • 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.
  • 相关阅读:
    JSOI 2008 火星人prefix
    OI 中的 FFT
    浅谈最大化子矩阵问题
    qq空间答案
    若瑟夫问题
    [颓废] 改某人的WebGL light mapping demo并9xSSAA
    Codeforces Round #402 (Div. 2) C. Dishonest Sellers
    Codeforces Round #402 (Div. 2) D. String Game
    Codeforces Round #401 (Div. 2) E. Hanoi Factory
    Codeforces Round #401 (Div. 2) D. Cloud of Hashtags
  • 原文地址:https://www.cnblogs.com/LceMeaning/p/3426986.html
Copyright © 2011-2022 走看看