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.

  • 相关阅读:
    手把手教你利用create-nuxt-app脚手架创建NuxtJS应用
    初识NuxtJS
    webpack打包Vue应用程序流程
    用选择器代替表格列的筛选功能
    Element-UI
    Spectral Bounds for Sparse PCA: Exact and Greedy Algorithms[贪婪算法选特征]
    Sparse Principal Component Analysis via Rotation and Truncation
    Generalized Power Method for Sparse Principal Component Analysis
    Sparse Principal Component Analysis via Regularized Low Rank Matrix Approximation(Adjusted Variance)
    Truncated Power Method for Sparse Eigenvalue Problems
  • 原文地址:https://www.cnblogs.com/coolsundy/p/3813815.html
Copyright © 2011-2022 走看看