dポイントプレゼントキャンペーン実施中!

いつもお世話になります。
C++Builder5のアプリ(ホスト)とVC++のアプリ(ターゲット)を
作成しています。
ホスト側のスタート/ストップボタンでターゲット側の動作を
開始、停止させたいのですが良い案が浮かびません。

案の1つとして
それぞれのアプリがあるフォルダをポーリングしていて
動作指示ファイル(Start.datなど)を作成すると、
ターゲット側がそのファイルを発見して動作を開始する。
応答として(Started.dat)を作成する。
停止時も同様のやりとり。

上記の条件でとりあえずは実現できたのですがあまり
効率が良くない(それぞれがポーリングしているなど)
のでFindWindowやPostMassageを使用すればもう少し
上手く出来るかもしれないと聞きました。
調べているのですがFindWindowやPostMassageの使い方が
特にターゲット側でどう処理して良いのか分かりません。

そこまで分かったなら自分で調べろと言われても仕方が
無いのですが急いでいるのでもしご存知の方、もしくは
参考サイト、サンプルなどございましたら教えて
いただけ無いでしょうか。
自分でも引き続き調べますのでよろしくお願いします。

A 回答 (4件)

ターゲット側のウィンドウに識別しやすい適当な文字列を設定しておきます。


(ここでは "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 関数を使用してください。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/10/26 11:48

#3です。



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

サンプルは参考URLをどうぞ。

参考URL:http://hp.vector.co.jp/authors/VA007941/program/ …

この回答への補足

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

補足日時:2005/10/26 13:53
    • good
    • 0

プロセス間通信の一つである「メールスロット」を使う手もあります。


使用するAPIは
 CreateMailslot サーバ側のOpen
 CreateFile クライアント側のOpen
 WriteFile 送信
 ReadFile 受信
です。
この方法であれば任意の情報を送信できます。
検索してみてください。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/10/28 15:40

Windowsを使うのであれば、プロセス間の情報の共有には名前つきオブジェクトを使うのが楽です。



スタート・ストップのようなフラグ的情報であればEventオブジェクトを使うのがよいでしょう。関連するAPIは

CreateEvent/OpenEvent/SetEvent/ResetEvent/PulseEvent/WaitForSingleObject/WaitForMultipleObjects

です。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/10/26 11:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!