- ベストアンサー
VC++6.0 MFC GetCommandLine()で取得したコマンドラインをすでに起動しているプログラムに渡す。
お世話になります。 VC++6.0 MFC で開発しております。 プログラムAでGetCommandLine()で取得したコマンドラインをすでに起動しているプログラムBに渡すにはどのような関数を使えばよいのでしょうか? お手数ですが、何卒よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>プログラムAに、「1のファイルを開け!というコマンドラインを渡し、 >プログラムAからそのコマンドラインをプログラムBに渡し、 >プログラムBからファイルを開くということがしたいのです。 >プログラムAB共に自分で開発しており、 >ファイルを開いて見れるアプリなのです。 プロセス間通信によりプログラムAからプログラムB にコマンドラインを送信し、 プログラムB側で、 受け取ったコマンドラインを解析して ファイルを開けば良いのでは? プロセス間通信は、WM_COPYDATAでも、 共有ファイルでもいいし、他にも名前付きパイプ等色々あります。 受け側では、プロセス間通信により 受け取ったコマンドラインを解析し、 ファイルを開く関数にファイル名を引き渡し、 開かせればよいのではないでしょうか? 自分で開発したプログラムなのですから ファイル名を引数で与えて開く関数は 作ってあるでしょう?
その他の回答 (3)
- redfox63
- ベストアンサー率71% (1325/1856)
> すでに起動しているプログラムB このプログラムBも kgyqk433さんが開発しているものですか? または、ソースがあり内容を変更できるのでしょうか どのようなものを想定しているのかをもう少し具体的にしたほうが的確な回答を得やすいかと思います たとえば 1) 自分で開発しているコンソール型のアプリ 2) 既存のWindows付属のメモ帳など GUI系のアプリ 3) 自分で開発している GUI系のアプリ
- BLK314
- ベストアンサー率55% (84/152)
>SendMessage()でWM_COPYDATAメッセージを >プログラムBに向かって送りつけるのが楽かもしれません。 一つのアイディアだと思います。 しかし、問題があります。 送り元のプログラムは、送信先のウィンドウ・ハンドルをどうやって 入手するのでしょう? FindWindow()等で検索する必要があると思います。 ちょっと面倒です。 さらに、受け取りたいのがアプリのメインウィンドウならば良いのですが、 メインウィンドウ以外の場合 (ex MFC Doc/View のViewで受け取り、クライアント領域に 描画したい場合) メインウィンドウからルーティングしなければなりません。 これも面倒です。 私は、シンプルに”ファイル"(共有ファイル)をお勧めします。 適当なフォルダ (決め打ちでもいいですし、 GetTempPath()で取得してもかまいません) に決め打ちのファイルを作ることにします。 送信元はただ書き込むのみです。 受信側は、必要な場所で読み込めばOKです。 Viewで必要なら、 Viewのタイマーかなんかでチェックし、 読み終わったら削除し、タイマーを切ればよいのです。 ウィンドウハンドルを気にする必要もないし、 メインウィンドウからルーティングしてもらう必要もありません。 WM_COPYDATAに比し、弱点は 1)ハードディスクを使うので、I/Oエラーを処理する必要があります。 2)ハードディスクを使うので、速度が遅いです。 しかし、SendMessage()の場合も、相手がビジーであれば遅くなります。 むしろ、ファイルの場合は完全非同期なので、 相手がビジー状態であってもすぐに戻れるメリットがあります。 PostMessage()に代えれば? という声もありますが、 残念なことにWM_COPYDATAはPostMessageできません。 http://mrxray.on.coocan.jp/Halbow/Notes/N012.html 結論としては A)受け手が安定したプログラム(何秒もビジーになったりしない)で、 FindWindow()で簡単にウィンドウを見つけられる (独自のウィンドウ・クラスを登録してる、 独自のキャプションを付けている等) この場合は、WM_COPYDATAがお勧めできます B)上記に該当しない場合 不安定なプログラムであったり、 MFCのデフォルトのウィンドウ・クラス名をそのまま流用していたり、 キャプションもアプリ名を省いたものに代えていたりとういう場合 ファイルベースがお勧めです
お礼
私の言葉不足ですみません。。。 プログラムAでGetCommandLine()で取得したコマンドラインをプログラムBにコマンドラインとして渡したいのです。。 プログラムAに、「1のファイルを開け!というコマンドラインを渡し、プログラムAからそのコマンドラインをプログラムBに渡し、プログラムBからファイルを開くということがしたいのです。 言葉不足で大変もうしわけございません。
- machongola
- ベストアンサー率60% (434/720)
こんばんは。 SendMessage()でWM_COPYDATAメッセージをプログラムBに向かって送りつけるのが楽かもしれません。 送信側 http://msdn.microsoft.com/ja-jp/library/ms649011(en-us,VS.85).aspx 受信側 http://msdn.microsoft.com/ja-jp/library/5hcat2sc(VS.80).aspx 其の他、当方は試した事はないのですが、受信側に受け付け用のエディットボックスを用意しておき、送信側が其のエディットボックスに向かって、WM_SETTEXTで文字列を送信しても、容易に出来るのだそうです。
お礼
私の言葉不足ですみません。。。 プログラムAでGetCommandLine()で取得したコマンドラインをプログラムBにコマンドラインとして渡したいのです。。 プログラムAに、「1のファイルを開け!というコマンドラインを渡し、プログラムAからそのコマンドラインをプログラムBに渡し、プログラムBからファイルを開くということがしたいのです。 言葉不足で大変もうしわけございません。
お礼
私の言葉不足ですみません。。。 プログラムAでGetCommandLine()で取得したコマンドラインをプログラムBにコマンドラインとして渡したいのです。。 プログラムAに、「1のファイルを開け!というコマンドラインを渡し、プログラムAからそのコマンドラインをプログラムBに渡し、プログラムBからファイルを開くということがしたいのです。 言葉不足で大変もうしわけございません。 プログラムAB共に自分で開発しており、ファイルを開いて見れるアプリなのです。 お手数ですがよろしくお願いします。