程序只允许运行一个实例的三种例子
一:互斥体
program test;
uses
Windows;
var
MutexHandle: Longword;
begin
if OpenMutex(MUTEX_ALL_ACCESS, FALSE, 'test')=0 then
begin
MutexHandle := CreateMutex(nil,TRUE,'test'); //创建一个互斥体,禁止重复运行
MessageBox(0, pchar('try run another?'), pchar('It Works'), 0);
ReleaseMutex(MutexHandle); //关闭互斥体
end;
end.
异常退出了,互斥体还不消失
二:全局原子
program test;
Uses Windows
const iAtom=‘SingleApp’;
begin
if GlobalFindAtom(iAtom)=0 then
begin
GlobalAddAtom(iAtom);
MessageBox(0, pchar('only 1'), pchar('It Works'), 0);
GlobalDeleteAtom(GlobalFindAtom(iAtom));
end;
end.
三:内存影射
除了能保存全局变量,还可以唯一标志,但异常退出的话也不能消失
program test;
Uses Windows
var
hMappingFile: THandle;
PShared: ^TShared;
begin
hMappingFile := OpenFileMapping(FILE_MAP_READ, False, 'test');
if hMappingFile = 0 then
begin
hMappingFile := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, SizeOf(TShared), 'test');
PShared := MapViewOfFile(hMappingFile, FILE_MAP_WRITE or FILE_MAP_READ, 0, 0, 0);
MessageBox(0, pchar('the one'), pchar('It Works'), 0);
UnmapViewOfFile(PShared);
CloseHandle(hMappingFile);
end;
end.
评论