|
タイトルの件について、これを考える上で重要なのはどのプロセスに属するメモリー空間で共有するかと言うことをまず考えないといけない。
たとえば自作ソフトのi-portの場合、explorerの拡張DLLとして実装しておりexplorerは複数立ち上がらない(explorerが不正終了して死にきらない場合などを除く)ためので、仮に複数のDLLで実装しても同一のメモリー空間で動作する。
そうではなく、自作のソフトAと自作のソフトBで共有したい場合、別プロセスの場合同然メモリー空間も別なので共有したいデータによって共有方法を検討しなおす必要がある。
ざっと思いつく限りでも以下のものが出てくる。
1.同一プロセス空間でのデータ共有としてのstatic変数
2.複数プロセス空間でのデータ共有としてEXE形式のCOM
3.複数プロセス空間でのデータ共有としてメモリーマップドファイル
4.複数プロセス空間や複数マシンでのデータ共有として外部データベース
当方はVC++6.0を利用しているのでそれを使ってになるが、1と2について簡単に試してみる。
1について、VC++を立ち上げてプロジェクトの新規作成からWin32 Dinamic Link Libraryを作成する。
このとき、シンボルをexportするdllを作成することにより簡単な雛型を作成してくれる。
ソース自体は小さいので一読いただければよいがポイントは__declspec(dllexport),__declspec(dllimport)のdefine文である。
詳細はMSDNを引けば記載があるがようは、DLLとしてコンパイルされる時はコンパイルされる時に「該当DLLの中に変数が定義されますよ」と言う宣言であり、EXEとしてコンパイルされる時は「別DLLにこの変数は定義されますよ」と言う宣言なのである。
2については、VC++を立ち上げてATL COM AppWizardを作成する。
このときに実行可能ファイル形式を作成する。
このATL COM AppWizardで公開されるCOMオブジェクトは専用のメモリー空間動作する。
仮にこのCOMEXEをExeAとした場合、外部EXEからCOMオブジェクトが生成されても外部EXEのメモリー空間ではなく新規にExeAが起動されそのメモリー空間でCOMオブジェクトが生成されるのである。
また、別々の外部EXEから起動されたとしても生成されるExeAはひとつだけである。
なので、COMEXE内でStatic変数を定義しておけばそれはCOMオブジェクト内で共有データとして利用できるのである。
両者はstatic変数であるため、単純な変数だけでなくclassでも応用が出来る部分にあり外部データベースを検討するほどではなかったり、メモリーマップドファイルのように固定領域にシリアライズするのが難しい場合に気軽に利用できる。
但し、これらについて初期化処理・終了処理・排他処理などは別途検討されていなければならない。
自作ソフトi-port紹介ページ http://www.geocities.jp/ys_and_otherjp/index.htm |

- >
- コンピュータとインターネット
- >
- コンピュータ
- >
- ソフトウェア







