delphi.gif (306 バイト) 共有メモリ


共有メモリを使うとプロセス間でデータを共有することができます。共有メモリは、他のプロセス間通信と違ってデータの移動がないため高速です。

 

toach.gif (917 バイト) 共有メモリオブジェクトを作成するには

共有メモリオブジェクトを作成するには、Win32 APIのCreateFileMapping関数を使います。共有メモリを作成するときには、ハンドルを$FFFFFFFFと指定します。

delphi1.gif (322 バイト)
// 作成
StrPCopy(pName, FObjectName);
FHandle := CreateFileMapping(
  $FFFFFFFF,
  nil,
  PAGE_READWRITE,
  0,
  FSize,
  pName);

// すでに他のプロセスによって共有メモリオブジェクトが作成されている場合は、
// CreateFileMappingは失敗する。
    if GetLastError() <> 0 then
    begin
        FHandle := 0;
    end;

共有メモリが不要になったら、CloseHandle関数によって解放します。

delphi1.gif (322 バイト)
// 共有メモリを破棄
if FHandle <> 0 then
begin
  CloseHandle(FHandle);
end;

 

toach.gif (917 バイト) 共有メモリにアクセスするには

共有メモリにアクセスするには、OpenFileMapping関数により名前付きファイルマッピングオブジェクトを開き、MapViewOfFile関数によって自分のアドレス空間に共有メモリをマッピングします。

delphi1.gif (322 バイト)
{ 共有メモリの内容をローカルバッファに読み込む }
procedure TCommonMem.Read;
var
  pAddress, p: ^Byte;
  NamedHandle: LongInt;
  i: LongInt;
  pName: array[0..79] of Char;
begin
  // クリアしておく
  for i := 0 to MaxAddr do
    FBuffer[i] := 0;

    // 名前付きオブジェクトのハンドルを取得
  StrPCopy(pName, FObjectName);
  NamedHandle := OpenFileMapping(
        FILE_MAP_READ or FILE_MAP_WRITE,
        False,
        pName);

   if NamedHandle = 0 then
   begin
     Raise EAbort.Create('名前付きオブジェクトのハンドルを取得に失敗した。');
   end;

   // 呼び出し側アドレス空間にマッピング
   pAddress := MapViewOfFile(
        NamedHandle,
        FILE_MAP_READ or FILE_MAP_WRITE,
        0,
        0,
        0);

   if pAddress = nil then
   begin
     Raise EAbort.Create('ビューのマッピングに失敗した。');
   end;

  // バッファにコピー
  p := pAddress;
  for i := 0 to MaxAddr do
  begin
    FBuffer[i] := p^;
    Inc(p);
  end;

  // アンマップする
  UnmapViewOfFile(pAddress);

  // 取得したハンドルを破棄する
  CloseHandle(Namedhandle);

end;