程序只允许运行一个实例的三种例子 一:互斥体 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.

评论