• ベストアンサー

アプリケーション間での操作

いつもお世話になります。 C++Builder5のアプリ(ホスト)とVC++のアプリ(ターゲット)を 作成しています。 ホスト側のスタート/ストップボタンでターゲット側の動作を 開始、停止させたいのですが良い案が浮かびません。 案の1つとして それぞれのアプリがあるフォルダをポーリングしていて 動作指示ファイル(Start.datなど)を作成すると、 ターゲット側がそのファイルを発見して動作を開始する。 応答として(Started.dat)を作成する。 停止時も同様のやりとり。 上記の条件でとりあえずは実現できたのですがあまり 効率が良くない(それぞれがポーリングしているなど) のでFindWindowやPostMassageを使用すればもう少し 上手く出来るかもしれないと聞きました。 調べているのですがFindWindowやPostMassageの使い方が 特にターゲット側でどう処理して良いのか分かりません。 そこまで分かったなら自分で調べろと言われても仕方が 無いのですが急いでいるのでもしご存知の方、もしくは 参考サイト、サンプルなどございましたら教えて いただけ無いでしょうか。 自分でも引き続き調べますのでよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • qwertyf
  • ベストアンサー率51% (14/27)
回答No.1

ターゲット側のウィンドウに識別しやすい適当な文字列を設定しておきます。 (ここでは "Target Window" とします) ホスト側で、FindWindow 関数でターゲット側のウィンドウを検索します。  例: hwnd = FindWindow( NULL, "Target Window" ); ターゲットを制御する際、PostMessage でターゲット側のウィンドウに メッセージを送信します。  例: PostMessage( hwnd, WM_APP + 0x100, 0, 0 ); SendMessage 関数を用いるとターゲット側の処理が終わるのを待つことが出来ます。 ターゲット側ではウィンドウプロシージャでメッセージを受け取ります。 例: ( switch 文の中として )   case (WM_APP + 0x100):     (制御メッセージを受け取った際の処理…) WM_APP というのは自分でメッセージを定義する為の定数です。 #define WM_CTRLTARGET (WM_APP+0x100) とでもしておくと便利です。 他のプログラムとメッセージ識別子が重なるのを避けたい場合は RegisterWindowMessage 関数を使用してください。

numeneko
質問者

お礼

早速のご回答ありがとうございます。 現在悪戦苦闘中なのですが少し進んだ気がします。 引き続き調べながらしていますので何かありましたら宜しくお願いします。

その他の回答 (3)

noname#15691
noname#15691
回答No.4

#3です。 メールスロットは、一方向ですが、ファイルの読み書きと同じ手順で情報を渡せます。 質問の内容からすると、 ターゲット側 = メールスロットのサーバ ホスト側 = メールスロットのクライアント になります。 サンプルは参考URLをどうぞ。

参考URL:
http://hp.vector.co.jp/authors/VA007941/program/no2146.html
numeneko
質問者

補足

ご回答ありがとうございます。 このような方法もあるのですか。現在別の用事で 作業が止まっているのですが、時間が出来次第 調べてみようと思います。

noname#15691
noname#15691
回答No.3

プロセス間通信の一つである「メールスロット」を使う手もあります。 使用するAPIは  CreateMailslot サーバ側のOpen  CreateFile クライアント側のOpen  WriteFile 送信  ReadFile 受信 です。 この方法であれば任意の情報を送信できます。 検索してみてください。

numeneko
質問者

お礼

アドバイスありがとうございます。 最初にアドバイスをくださった方の案で一応解決には 向かいました。 申し訳ないのですがポイントを発行できる人数が 限られているためポイントの発行順位を 解決案(No1の方)→解答を下さった順とさせていただきます。 今後の参考にさせていただきます。

  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.2

Windowsを使うのであれば、プロセス間の情報の共有には名前つきオブジェクトを使うのが楽です。 スタート・ストップのようなフラグ的情報であればEventオブジェクトを使うのがよいでしょう。関連するAPIは CreateEvent/OpenEvent/SetEvent/ResetEvent/PulseEvent/WaitForSingleObject/WaitForMultipleObjects です。

numeneko
質問者

お礼

ご回答ありがとうございます。下記の方とは違う方法 なのですよね。(申し訳ございません無知なもので) 調べてみて簡単に実現できそうならばしてみることに します。まだ苦闘中ですので何かありましたらよろしくお願いします。

関連するQ&A

専門家に質問してみよう