[笔记]内存文件映射_共享内存

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;

各函数注释可参考如下衔接

CreateFileMapping , OpenFileMapping, MapViewOfFile, UnmapViewOfFile 和 FlushViewOfFile_老白436196571的博客-CSDN博客_createfilemapping

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值