shareMemName = 'shareMemName';
type
pDataBlock = ^DataBlock;
DataBlock = record //
RUN_STOP_show: UInt64; //运行停止 0 停止 1 运行
Mode_show: UInt64; //当前模式 0:DC模式 1:AC模式 2:DC+AC模式
Error_show: UInt64; //总故障标志 0 无故障 1 有故障
DCVol: double; //直流输出电压
DCCur: Double; //直流输出电流
DCPow: double; //直流功率
...
DataValid: integer; //循环次数
end;
pDevBlock: pDataBlock;
1. 进程一
function DataShare(idx: integer): Boolean;
var
lasterr: Cardinal;
begin
Result := false;
fileHandle := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, SizeOf(DataBlock), PChar(shareMemName + '_' + IntToStr(idx)));
lasterr := GetLastError();
if lasterr = ERROR_FILE_INVALID then //如果企图创建一个零长度的文件映射, 应有此报
begin
exit;
end
else if lasterr = ERROR_INVALID_HANDLE then //如果发现你的命名内存空间和现有的内存映射, 互斥量, 信号量, 临界区同名就麻烦了
begin
exit;
end
else if lasterr = ERROR_ALREADY_EXISTS then//表示内存空间命名已经存在 读取这个内存文件名
begin
fileHandle := OpenFileMapping(FILE_MAP_ALL_ACCESS, false, PChar(shareMemName + '_' + IntToStr(idx)));
end;
pDevBlockBlock := MapViewOfFile(FileHandle, windows.FILE_MAP_ALL_ACCESS, 0, 0, sizeof(DataBlock));
if not Assigned(pDevBlock) then
begin
exit;
end;
Result := true;
end;
2. 进程2
function SystemDataShare(idx: integer): Boolean;
var
length: integer;
begin
Result := false;
RealDatafileHandle := OpenFileMapping(FILE_MAP_ALL_ACCESS, false, PChar(shareMemName + '_' + IntToStr(idx)));
if RealDatafileHandle = 0 then
begin
exit;
end
else
begin
pDevBlockBlock := MapViewOfFile(RealDatafileHandle, FILE_MAP_ALL_ACCESS, 0, 0, sizeof(DataBlock));
if pDevBlockBlock = nil then
begin
exit;
end;
end;
Result := true;
end;
各函数注释可参考如下衔接