- ベストアンサー
Delphi6 DLL内でのメモリ共有(?)
こんにちは、honiyonです。 複数アプリケーションからそれぞれコールバック関数を登録してもらい、状況に応じてそれぞれのコールバック関数を呼び出す、というDLLを作成しています。 しかし現在、呼び出しアプリケーションごとにメモリ空間が独立してしまい、コールバック情報を同一空間内で管理出来ずに困っています。 旧VerのDelphiで16bit DLLなら、interface部に定義した変数、オブジェクトはDLL内で同一空間内で共有出来るようですが、これをDelphi6 32bitDLLで行う事は不可能でしょうか? もしくは、その他の方法で独立メモリ空間を作らないようにする方法はありますでしょうか? 不可能な場合、CreateFileMappingが次に有効な手段として候補に挙がると思います。CreateFileMappingで管理クラスのポインタを渡してクラス共有というのは現実的な手法でしょうか? よろしくお願いいます(..
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
Delphiは無知なので一般的な意見です。 メモリマップドファイル(共有メモリ)は現実的だと思います。特に16->32bit移行時には良く使われた手法ではないかと思います。 片やDLLの共有領域はVC++等では共有セグメントを指定すれば可能ですが、Delphi(特にLinker)でどのような扱いになるのか??? Win32の寿命、その他から、個人的には共有メモリを推します。
その他の回答 (1)
- chokuto
- ベストアンサー率40% (2/5)
私もDelphiは知らないので、一般的な意見を…。 CreateFileMapping による共有メモリが有効だと思いますが、「管理クラスのポインタを渡して」という方法でうまくいくのかどうかは分かりません。必要なデータだけを共有メモリにおくべきだと思います。 複数アプリからということなので、アプリごとに異なるデータをやり取りするのなら、ウィンドウメッセージを使うという方法もあります。対象アプリにはウィンドウハンドルを登録してもらって、独自のメッセージコード(WM_USER以降)やWM_COPYDATAメッセージなどでデータをやり取りするのも一つの手です。Delphiでメッセージ処理がどのように行われているのかはよく知りませんが…。
補足
こんにちは、honiyonです。 お礼が遅くなり申し訳ありませんm(_ _)m 失礼ながらここにまとめてお礼させて頂きます。 調査したところ、メモリ空間が完全に独立してしまい、ポインタを共有したところで、渡された側でデータを参照できませんでした。 今回共有したかったデータはクラス型であったり、少々無理を感じたので設計そのものを見直す事にしました。 ご回答有難うございました(。。