皆さんのお知恵をお借りしたいと思います。
2つのアプリケーションはCFormViewを使用したSDIです。
仮に「SDI1」「SDI2」とします。
SDI1にて「起動」ボタンを押されたらSDI2が起動します。
SDI2に存在するのエディットボックスにて文字列を入力し、「決定」ボタンを押したら
SDI1にあるエディットボックスに入力された文字列を出力させたいのです。
現状「起動ボタン」を押されたら「CreateProcess」でSDI2を起動するときに引数として
SDI1のウィンドウハンドルを指定しています。
そしてSDI2の「決定ボタン」を押されたら引数で取得したウィンドウハンドルに対して
「WM_COPYDATA」を利用して入力された文字列を通知しています。
これはこれで正常に動くのですが、他に別のアイデアはないでしょうか。
環境:WIN2000SP2 VC++6.0SP4
共有メモリやパイプを利用する方法などがあると思います。
WM_COPYDATAでは何か都合が悪いのですか?
>共有メモリやパイプを利用する方法などがあると思います。
共有メモリの場合はSDI1でメモリを確保しておき、その確保したメモリの
アドレスをSDI2に通知するという手順になるのでしょうか?
ちなみに「パイプ」とはどういったものなのでしょうか?
よろしかったらご教授お願いします。
>WM_COPYDATAでは何か都合が悪いのですか?
特に都合は悪くないのですが、自分の少ない知識で凝り固まった
一つの考え方だけではなく、他にも方法がないものなのか皆さんに
ご意見を伺いたかったのです。
共有メモリ
Memory Mapped Fileという技術です。
メモリを共有するアプリ達のうち、どれかひとつがマップファイルを生成します。
CreateFileMapping()、MapViewOfFile()というAPIで行います。
後者の関数の戻り値は共有メモリの開始アドレスを示し、
そこにデータを書き込みます。
それ以外のアプリは、生成されたマップファイルにアクセスする準備をします。
OpenFileMapping()、MapViewOfFile()というAPIで行います。
> 共有メモリの場合はSDI1でメモリを確保しておき、その確保したメモリの
> アドレスをSDI2に通知するという手順になるのでしょうか?
>
共通の名前(文字列)を、アプリ間で示し合わせておくことで、
共通の領域を参照することが可能になります。
この名前は、CreateFileMapping()、OpenFileMapping()の引数で使われます。
両者とも、マップファイルが必要なくなったら、アンマップし、解放します。
UnmapViewOfFile()、CloseHandle()というAPIで行います。
まずは、これらAPIについて調べてみてください。
パイプですが、2つのプロセスをパイプ(管)でつないで、
その中にデータを通す・・・といったイメージになります。
親になるプロセスがCreatePipe()(だったか?)でパイプを生成しておきます。
子プロセスをCreateProcess()で起動する時、ハンドル継承のフラグがあるのですが、
これを有効にして子プロセスにパイプハンドルを継承させる、
という手順だったと記憶してます。
キーワードになるAPIを調べてみてください。
随分前にやったことあるのですが、細かいことは忘れてしまいました(ごめんなさい)。
二つの手法の詳しい内容については自分で調べてみようと思います。
ありがとうございました。