项目中要求应用程序在同一台机器上只能被打开一次,即进程中只要一个应用程序。左思右想,应该在程序之前做点什么。是不是要通过句柄什么的来得到该程序的进程,然后去进程列表中寻找是否已经存在此进程。
Mutex是互斥体的意思,当一个线程持有一个Mutex时,其它线程申请这个Mutex会被阻塞。可以通过Mutex来保证对某一资源的互斥访问(即同一时间内最多有一个线程来访问)。因此,我觉得Mutex的思想可以用在这个项目中。
Delphi中创建互斥体的函数为:
其中参数lpMutexAttributes用来设定Mutex对象的安全描述符和是否允许子进程继承句柄。bInitialOwner表明是否将Mutex的持有者设置为调用线程。lpName参数设置Mutex的名字,该名字区分大小写并不能包含"\",最大长度为MAX_PATH,
HANDLE CreateMutex(
LPSECURITY_ATTRIBUTES lpMutexAttributes,
BOOL bInitialOwner,
可设置为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.