要判断实例是否运行,必须在程序的消息循环之前,在 Delphi 中,是在 Application.Initialize 之前。实现本功能, Delphi 使用的主要函数是 CreateMutex。这个函数用来生成一个 Mutex 对象的句柄,这个句柄具有操作系统的全局命名空间。
Delphi 例子程序的部分代码如下:
const MB_MINE = MB_OK or MB_ICONINFORMATION or MB_TASKMODAL;
var
hMutex: DWORD;
begin
hMutex := CreateMutex(nil, TRUE,‘MyMutex’); //TRUE 标明该进程拥有此 Mutex 对象
if (GetLastError = ERROR_ALREADY_EXISTS) then //Mutex 对象是否存在
begin
ReleaseMutex(hMutex);
Exit; //退出程序
end
else
if hMutex = ERROR_INVALID_HANDLE then //检查"mymutex"这个名字是否被其他诸如文件映射、信号灯和事件等对象占用
MessageBox(0, ‘The name matched with a existing object!’, ‘Information’,MB_MINE)
else
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
ReleaseMutex(hMutex); //释放 Mutex 对象
end;