一、 创建互斥对象 在工程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. |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论