项目中要求应用程序在同一台机器上只能被打开一次,即进程中只要一个应用程序。左思右想,应该在程序之前做点什么。是不是要通过句柄什么的来得到该程序的进程,然后去进程列表中寻找是否已经存在此进程。

Mutex是互斥体的意思,当一个线程持有一个Mutex时,其它线程申请这个Mutex会被阻塞。可以通过Mutex来保证对某一资源的互斥访问(即同一时间内最多有一个线程来访问)。因此,我觉得Mutex的思想可以用在这个项目中。

Delphi中创建互斥体的函数为:

其中参数lpMutexAttributes用来设定Mutex对象的安全描述符和是否允许子进程继承句柄。bInitialOwner表明是否将Mutex的持有者设置为调用线程。lpName参数设置Mutex的名字,该名字区分大小写并不能包含"\",最大长度为MAX_PATH,

HANDLE CreateMutex(

    LPSECURITY_ATTRIBUTES lpMutexAttributes,    
    BOOL bInitialOwner,    

    LPCTSTR lpName   );

可设置为NULL表明该Mutex为匿名对象。
如果调用成功,则返回Mutex的句柄,否则返回NULL,如果lpName不为NULL且调用前同名的Mutex已被创建,则返回同名Mutex的句柄,此时调用GetLastError将返回ERROR_ALREADY_EXISTS,参数bInitialOwner将被忽略。

 

下面通过该函数来实现只能打开一个应用程序

在Delphi应用程序的Program文件中。填入如下代码:

 


  Forms,Windows,SysUtils,
  UntMain in 'UntMain.pas' {frmMain},
{$R *.res}
var
hMutex:THandle;
Ret:Integer;
begin
  Application.Title:
='EI';
  hMutex:
=CreateMutex(nil,true,'EI');
  Ret:
=GetLastError;

  
if Ret <> ERROR_ALREADY_EXISTS  then
  
begin
    Application.Initialize;
    Application.CreateForm(TfrmMain, frmMain);
   
end
  
else
  
begin
    Application.MessageBox(
'The System is Runing','Notes!',MB_OK);
    ReleaseMutex(hMutex);
  
end;
  Application.Run;
end.

 

 

相关文章:

  • 2022-12-23
  • 2021-06-25
  • 2022-12-23
  • 2021-06-27
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-11-14
  • 2021-09-23
  • 2021-10-18
  • 2022-12-23
  • 2021-09-07
  • 2022-12-23
相关资源
相似解决方案