共有メモリ
共有メモリを使うとプロセス間でデータを共有することができます。共有メモリは、他のプロセス間通信と違ってデータの移動がないため高速です。
共有メモリオブジェクトを作成するには
共有メモリオブジェクトを作成するには、Win32 APIのCreateFileMapping関数を使います。共有メモリを作成するときには、ハンドルを$FFFFFFFFと指定します。
例
// 作成
StrPCopy(pName, FObjectName);
FHandle := CreateFileMapping(
$FFFFFFFF,
nil,
PAGE_READWRITE,
0,
FSize,
pName);
// すでに他のプロセスによって共有メモリオブジェクトが作成されている場合は、
// CreateFileMappingは失敗する。
if GetLastError() <> 0 then
begin
FHandle := 0;
end;
共有メモリが不要になったら、CloseHandle関数によって解放します。
例
// 共有メモリを破棄
if FHandle <> 0 then
begin
CloseHandle(FHandle);
end;
共有メモリにアクセスするには
共有メモリにアクセスするには、OpenFileMapping関数により名前付きファイルマッピングオブジェクトを開き、MapViewOfFile関数によって自分のアドレス空間に共有メモリをマッピングします。
例
{ 共有メモリの内容をローカルバッファに読み込む }
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;