www.pudn.com > shijiantongbu.zip > mutex.pas


unit mutex; 
 
interface 
 
uses Windows, SysUtils; 
 
function GetExclusivity(const Name: string): boolean; 
procedure ReleaseExclusivity(const Name: string); 
 
implementation 
 
uses Classes; 
 
var 
  HeldHandles: TStringList; 
 
function GetExclusivity(const Name: string): boolean; 
 
var 
  res: HResult; 
 
begin 
  res := CreateMutex(nil,true,pchar(Name)); 
  if (res = 0) or (GetLastError = ERROR_ALREADY_EXISTS) then 
    begin 
      result := false; 
      exit; 
    end 
  else 
    begin 
      HeldHandles.AddObject(Name,TObject(res)); 
      result := true; 
    end; 
end; 
 
procedure ReleaseExclusivity(const Name: string); 
 
var 
  idx: integer; 
 
begin 
  idx := HeldHandles.IndexOf(Name); 
  if idx = -1 then 
    raise exception.create('We do not hold this handle'); 
  CloseHandle(integer(HeldHandles.Objects[idx])); 
  HeldHandles.Delete(idx); 
end; 
 
initialization 
  HeldHandles := TStringList.Create; 
finalization 
  HeldHandles.Free; 
end.