🧠 はじめに:なぜ共有メモリを使うのか
アプリケーション間でデータをやり取りする方法はいくつかあります。
代表的なものとして:
- ファイルを経由して読み書きする
- TCP/UDP ソケット通信を行う
- Named Pipe(名前付きパイプ)を利用する
しかしこれらは「I/O処理」が介在するため、速度やタイミングの同期が難しいという欠点があります。
一方で、共有メモリ(Memory-Mapped File) を使うと、
OSが管理する同一メモリ空間を同じのプロセスで共有でき、
高速かつ安全にデータを交換できます。
別プロセス間で共有するには管理者権限が必要
💡 例えば、画像処理ソフトやマルチスレッドエンジン、DirectXなどでも
内部で同じ仕組みを使ってデータを共有しています。
🧩 本記事で扱う内容
Delphiで共有メモリを扱うための基礎クラス
TSharedMemoryBase と、
それを利用した文字列共有クラス TSharedMemoryStringList を紹介します。
また、実際に動作を確認できるフォーム:
- 固定レコード(文字列+数値)共有フォーム
→SharedMemorySampleSubForm - 文字列リスト共有フォーム
→SharedMemorySampleListForm
の2つを使い、共有メモリを用いたリアルタイムなデータ共有を実際に確認します。
⚙️ クラス構成
| クラス名 | 役割 |
|---|---|
TSharedMemoryBase |
共有メモリの生成・マッピング・破棄を担当。構造体やバイナリを書き込める基礎クラス。 |
TSharedMemoryStringList |
固定長文字列の配列を共有メモリ上に保持。Add / IndexOf / Count などの簡易APIを提供。 |
💡 共有メモリの基本概念
Windows API の CreateFileMapping と MapViewOfFile を使うと、
OS管理下にある物理メモリ領域を「ファイルのように扱う」ことができます。
この仕組みをDelphiから直接利用するのが TSharedMemoryBase です。
ファイルを作らずに INVALID_HANDLE_VALUE を指定することで、
純粋なメモリ共有(非永続) が実現できます。
🧱 実装概要
🔹 1. 共有メモリの生成
FHandle := CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, Size, PChar(Name));
FView := MapViewOfFile(FHandle, FILE_MAP_ALL_ACCESS, 0, 0, Size);
🔹 2. データの読み書き
固定サイズの領域を Move を使って直接コピーします。
Move(Data, FView^, SizeOf(Data));
🧮 使い方(TSharedMemoryStringList)
uses SharedMemoryBase;
var
Shared: TSharedMemoryStringList;
begin
Shared := TSharedMemoryStringList.Create('Local\SampleList', 32, 64);
Shared.Add('Example A');
Shared.Add('Example B');
ShowMessage(Shared[0]); // => Example A
Shared.Free;
end;
上記のように単純に生成して使うだけで、
同じプロセス上の別フォーム間でも同じメモリ領域を共有できます。
🧪 サンプルフォーム①:SharedMemorySampleSubForm
🔸 概要
このフォームでは、固定長レコード(文字列+数値) を共有します。
構造体をそのまま共有メモリに書き込むため、可変長文字列は使用せず固定バッファ化しています。
| コンポーネント | 役割 |
|---|---|
| Edit(文字列) | 固定長文字列を入力 |
| Edit(数値) | 整数値を入力 |
| Button(書き込み) | 入力内容を共有メモリに保存 |
| Button(読み込み) | 共有メモリから読み出し |
| Label | 状態表示(IsOwner, Sizeなど) |
🔸 動作イメージ
🖼️ 書き込み
🖼️ 読み込み(別インスタンスで)
片方で数値や文字列を書き換えると、
もう片方で「読み込み」ボタンを押すだけで即座に反映されます。
🧾 サンプルフォーム②:SharedMemorySampleListForm
🔸 概要
TSharedMemoryStringList を利用した、文字列配列共有サンプルです。
複数フォームを同時に開き、内容が共有されることを確認します。
| コンポーネント | 役割 |
|---|---|
| Label | 現在の行数を表示 |
| Memo | 共有されている文字列を表示/編集 |
| Button(読み込み) | メモリ → Memo に反映 |
| Button(書き込み) | Memo → メモリに保存 |
🔸 動作イメージ
🖼️ フォームA(書き込み側)
🖼️ フォームB(読み込み側)
片方で「書き込み」を押すと、
もう一方の「読み込み」で内容が同期します。
複数フォームを開いて同じ Local\SampleList 名を使用すれば、
すべてが同じ共有メモリを参照します。
⚙️ 開発環境
- Delphi 10 以降
- Windows 10 / 11
- 32bit / 64bit 対応
📚 まとめ
共有メモリを使うことで、
- 高速でI/Oを伴わないデータ共有
- 同じプロセスのプログラムで構造体レベルの通信
- UIフォーム間でのリアルタイム同期
といった動作を、わずか数行で実装できます。
TSharedMemoryBase は最小限のラッパクラスであり、
自作のデータ構造(レコード・画像・設定)を自由に共有できる
拡張可能な基礎ユニット です。
🔗 ソースコード
GitHub:
👉 https://github.com/vramwiz/SharedMemoryBase
🏷️ License
MIT License
Copyright (c) 2025 VRAMWiz



