2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Delphiで共有メモリを使ったデータ共有を実現する【TSharedMemoryBase / TSharedMemoryStringList】

Last updated at Posted at 2025-10-30

🧠 はじめに:なぜ共有メモリを使うのか

アプリケーション間でデータをやり取りする方法はいくつかあります。
代表的なものとして:

  • ファイルを経由して読み書きする
  • 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 の CreateFileMappingMapViewOfFile を使うと、
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など)

🔸 動作イメージ

🖼️ 書き込み

image.png

🖼️ 読み込み(別インスタンスで)

image.png

片方で数値や文字列を書き換えると、
もう片方で「読み込み」ボタンを押すだけで即座に反映されます。


🧾 サンプルフォーム②:SharedMemorySampleListForm

🔸 概要

TSharedMemoryStringList を利用した、文字列配列共有サンプルです。
複数フォームを同時に開き、内容が共有されることを確認します。

コンポーネント 役割
Label 現在の行数を表示
Memo 共有されている文字列を表示/編集
Button(読み込み) メモリ → Memo に反映
Button(書き込み) Memo → メモリに保存

🔸 動作イメージ

🖼️ フォームA(書き込み側)

image.png

🖼️ フォームB(読み込み側)

image.png

片方で「書き込み」を押すと、
もう一方の「読み込み」で内容が同期します。
複数フォームを開いて同じ 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

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?