因为一个小程序的需要,写了这么一段小代码,完美实现进程同步。
Procedure CreadMax;
var
FHandle: LongWORD;
begin
FHandle := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, $ffff, 'ZMRKEY');
if FHandle = 0 then
begin
if GetLastError = ERROR_ALREADY_EXISTS then
begin
FHandle := OpenFileMapping(FILE_MAP_ALL_ACCESS, False, 'ZMRKEY');
if FHandle = 0 then Exit;
DLLData := MapViewOfFile(FHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0);
if DLLData = nil then CloseHandle(FHandle);
DllData.i := 0;
end;
end
else
begin
FHandle := OpenFileMapping(FILE_MAP_ALL_ACCESS, False, 'ZMRKEY');
if FHandle = 0 then Exit;
DLLData := MapViewOfFile(FHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0);
if DLLData = nil then CloseHandle(FHandle);
DllData.i := DllData.i + 1;;
end;
end;
//使用方法
CreadMax;
while DllData.i < 5 do
begin
Sleep(100);
if DllData.i > 5 then
begin
ExitProcess(0);
end;
WinExec(PChar(ParamStr(0)),1);
end;
//DllData.i就是这个exe第几个运行了
//用完了之后不要忘了用UnmapViewOfFile(DllData)卸载共享内存哦!