いつもお世話になります。
C++Builder5のアプリ(ホスト)とVC++のアプリ(ターゲット)を
作成しています。
ホスト側のスタート/ストップボタンでターゲット側の動作を
開始、停止させたいのですが良い案が浮かびません。
案の1つとして
それぞれのアプリがあるフォルダをポーリングしていて
動作指示ファイル(Start.datなど)を作成すると、
ターゲット側がそのファイルを発見して動作を開始する。
応答として(Started.dat)を作成する。
停止時も同様のやりとり。
上記の条件でとりあえずは実現できたのですがあまり
効率が良くない(それぞれがポーリングしているなど)
のでFindWindowやPostMassageを使用すればもう少し
上手く出来るかもしれないと聞きました。
調べているのですがFindWindowやPostMassageの使い方が
特にターゲット側でどう処理して良いのか分かりません。
そこまで分かったなら自分で調べろと言われても仕方が
無いのですが急いでいるのでもしご存知の方、もしくは
参考サイト、サンプルなどございましたら教えて
いただけ無いでしょうか。
自分でも引き続き調べますのでよろしくお願いします。
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 関数を使用してください。
早速のご回答ありがとうございます。
現在悪戦苦闘中なのですが少し進んだ気がします。
引き続き調べながらしていますので何かありましたら宜しくお願いします。
No.4
- 回答日時:
#3です。
メールスロットは、一方向ですが、ファイルの読み書きと同じ手順で情報を渡せます。
質問の内容からすると、
ターゲット側 = メールスロットのサーバ
ホスト側 = メールスロットのクライアント
になります。
サンプルは参考URLをどうぞ。
参考URL:http://hp.vector.co.jp/authors/VA007941/program/ …
この回答への補足
ご回答ありがとうございます。
このような方法もあるのですか。現在別の用事で
作業が止まっているのですが、時間が出来次第
調べてみようと思います。
No.3
- 回答日時:
プロセス間通信の一つである「メールスロット」を使う手もあります。
使用するAPIは
CreateMailslot サーバ側のOpen
CreateFile クライアント側のOpen
WriteFile 送信
ReadFile 受信
です。
この方法であれば任意の情報を送信できます。
検索してみてください。
アドバイスありがとうございます。
最初にアドバイスをくださった方の案で一応解決には
向かいました。
申し訳ないのですがポイントを発行できる人数が
限られているためポイントの発行順位を
解決案(No1の方)→解答を下さった順とさせていただきます。
今後の参考にさせていただきます。
No.2
- 回答日時:
Windowsを使うのであれば、プロセス間の情報の共有には名前つきオブジェクトを使うのが楽です。
スタート・ストップのようなフラグ的情報であればEventオブジェクトを使うのがよいでしょう。関連するAPIは
CreateEvent/OpenEvent/SetEvent/ResetEvent/PulseEvent/WaitForSingleObject/WaitForMultipleObjects
です。
ご回答ありがとうございます。下記の方とは違う方法
なのですよね。(申し訳ございません無知なもので)
調べてみて簡単に実現できそうならばしてみることに
します。まだ苦闘中ですので何かありましたらよろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAでコントロールのハンドルを...
-
他のウィンドウのボタンを自動...
-
メッセージハンドラ
-
vbaから他のアプリを終了
-
メッセージボックスの選択ボタ...
-
VB.netでSendMessageを使用して...
-
デスクトップ上のアイコンの位...
-
VC++(MFC)でタスクバーに常駐し...
-
WM_NCLBUTTONUPについて
-
msgboxの表示位置
-
エクセルで作った新しいウイン...
-
コントロールの書式設定で、“コ...
-
グラフの交点の求め方(Excel)
-
「アイテムは収集されました」...
-
フォントの大きさ
-
コンボボックス内の文字サイズ変更
-
エクセルのコントロールツール...
-
スピンボタンを右クリックして...
-
VBAのフォント変更(エクセルか...
-
ExcelのBOOKが消えた!
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
vbaから他のアプリを終了
-
他のウィンドウのボタンを自動...
-
msgboxの表示位置
-
VBAでコントロールのハンドルを...
-
デスクトップ上のアイコンの位...
-
CloseHandle()
-
メッセージハンドラ
-
メッセージボックスの選択ボタ...
-
VB.netでFindWindowExやると・...
-
DEVICECHANGE() の受け取り
-
VBA 複数セルが空白なら印刷さ...
-
SetWindowText関数について
-
マウスの状態の取得
-
マウスフックについて
-
点滅で知らせる方法
-
Excel VBA で外部アプリケーシ...
-
SendMessage で ESC など
-
システム例外のメッセージを変...
-
windows終了時のメッセージにつ...
-
マウスホイールをフックしたい
おすすめ情報