跨程式實現資料傳遞之FileMapping實現

來源:互聯網
上載者:User

標籤:

一、傳遞資料結構定義及公用單元代碼:

需要引入單元:winapi.windows;

1、聲明部分

//使用者庫及主程式間資料共用相關
TAuthOnlineInfo = record
  IsDLL: Boolean;
  IsOnline: Boolean;
  IsAuth: Boolean;
  IsToDB: Boolean;
  CurDBID: Integer;
  UserName: string[255];
end;
PAuthOnlineInfo = ^TAuthOnlineInfo;
TAuthOnlineHelp = class
private
  const KeyName = ‘{89B70110-BC0A-426F-B097-3FC0271744AE}‘;

  class var FMapFile: THandle;
  class var FBuf: Pointer;
  class var FExist: Boolean;

  class function IsNT: Boolean;
public
  class function Exist: Boolean;
  //建立映射
  class function CreateMap(AInfo: PAuthOnlineInfo): Boolean;
  //更新映射
  class function UpdateMap(AInfo: PAuthOnlineInfo): Boolean;
  //關閉映射
  class procedure CloseMap;
  //擷取映射資料
  class function GetAuthOnlineInfo(AInfo: PAuthOnlineInfo): Boolean;
end;

2、實現部分

{ TAuthOnlineHelp }

class procedure TAuthOnlineHelp.CloseMap;
begin
  if FBuf <> nil then
    UnMapViewOfFile(FBuf);
  if FMapFile <> 0 then
    CloseHandle(FMapFile);
  FBuf := nil;
  FMapFile := 0;
end;

class function TAuthOnlineHelp.CreateMap(AInfo: PAuthOnlineInfo): Boolean;
var
  SecurityDescriptor: TSecurityDescriptor;
  SecurityAttr: TSecurityAttributes;
begin
  //需要加安全設定,才能跨使用者進程訪問
  if IsNT then
  begin
    SecurityAttr.nLength := SizeOf(SECURITY_ATTRIBUTES);
    SecurityAttr.bInheritHandle := True;
    SecurityAttr.lpSecurityDescriptor := @SecurityDescriptor;

    if not InitializeSecurityDescriptor(@SecurityDescriptor, 1) then
      raise Exception.CreateFmt(‘初始化安全設定失敗(%d)‘, [GetLastError]);
    if not SetSecurityDescriptorDacl(@SecurityDescriptor, TRUE, nil, FALSE) then
      raise Exception.CreateFmt(‘安全設定錯誤(%d)‘, [GetLastError]);
    if not SetKernelObjectSecurity(GetCurrentProcess, DACL_SECURITY_INFORMATION,
      @SecurityDescriptor) then
      raise Exception.CreateFmt(‘安全設定失敗(%d)‘, [GetLastError]);

    FMapFile := CreateFileMapping($FFFFFFFF, @SecurityAttr, PAGE_READWRITE,
      0, SizeOf(TAuthOnlineInfo), PChar(KeyName));
  end
  else
    FMapFile := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE,
      0, SizeOf(TAuthOnlineInfo), PChar(KeyName));
  if (FMapFile = 0) or (GetLastError() = ERROR_ALREADY_EXISTS) then
  begin
    Result := False;
    Exit;
  end
  else
    Result := True;
  FBuf := MapViewOfFile(FMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0);
  if (FBuf = nil) then
  begin

    raise Exception.CreateFmt(‘映射記憶體空間失敗 (%d).‘, [GetLastError]);
      CloseHandle(FMapFile);

    Result := False;
    Exit;
  end
  else if AInfo <> nil then
   CopyMemory(FBuf, AInfo, SizeOf(TAuthOnlineInfo));
  FExist := True;
end;

class function TAuthOnlineHelp.Exist: Boolean;
begin
  Result := FExist;
end;

class function TAuthOnlineHelp.GetAuthOnlineInfo(AInfo: PAuthOnlineInfo): Boolean;
var
  hMapFile: THandle;
  pBuf: Pointer;
begin
  Result := False;
  if (AInfo= nil) then Exit;

  hMapFile := OpenFileMapping(FILE_MAP_READ, FALSE, PChar(KeyName));
  if hMapFile = 0 then
  begin
    Result := False;
    Exit;
  end;

  pBuf := MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, SizeOf(TAuthOnlineInfo));
  if (pBuf = nil) then
  begin
    CloseHandle(hMapFile);
    Result := False;
    Exit;
  end;
  CopyMemory(AInfo, pBuf, SizeOf(TAuthOnlineInfo));
  UnmapViewOfFile(pBuf);
  CloseHandle(hMapFile);

  Result := True;
end;

class function TAuthOnlineHelp.IsNT: Boolean;
var
  OS: TOSVERSIONINFO;
begin
  OS.dwOSVersionInfoSize := SizeOf(TOSVERSIONINFO);
  GetVersionEx(OS);
  Result := (OS.dwMajorVersion >= 5) or (OS.dwPlatformId = VER_PLATFORM_WIN32_NT);
end;

class function TAuthOnlineHelp.UpdateMap(AInfo: PAuthOnlineInfo): Boolean;
begin
  Result := False;
  if (AInfo= nil) then Exit;

  if FMapFile = 0 then
    Exit
  else
  begin
    CopyMemory(FBuf, AInfo, SizeOf(TAuthOnlineInfo));
    Result := True;
  end;
end;

 

二、建立映射的進程代碼 

New(pInfo);  //pInfo 類型PAuthOnlineInfo 
pInfo.IsDLL := False;
pInfo.CurDBID := ASheet.App.BaseData.CurUserDBID;
if TAuthOnlineHelp.Exist then
  TAuthOnlineHelp.UpdateMap(pInfo)
else
  TAuthOnlineHelp.CreateMap(pInfo);
Dispose(pInfo);
ShellExecute(0, ‘Open‘, PWideChar(sFileName), nil, nil, SW_SHOWMAXIMIZED);  //sFileName是第二個進程名稱

 

三、讀取對應檔的進程代碼

New(pInfo);   //pInfo 類型PAuthOnlineInfo 
TAuthOnlineHelp.GetAuthOnlineInfo(pInfo);

跨程式實現資料傳遞之FileMapping實現

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.