• ベストアンサー

VC++6.0 MFC GetCommandLine()で取得したコマンドラインをすでに起動しているプログラムに渡す。

お世話になります。 VC++6.0 MFC で開発しております。 プログラムAでGetCommandLine()で取得したコマンドラインをすでに起動しているプログラムBに渡すにはどのような関数を使えばよいのでしょうか? お手数ですが、何卒よろしくお願いします。

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

  • ベストアンサー
  • BLK314
  • ベストアンサー率55% (84/152)
回答No.4

>プログラムAに、「1のファイルを開け!というコマンドラインを渡し、 >プログラムAからそのコマンドラインをプログラムBに渡し、 >プログラムBからファイルを開くということがしたいのです。 >プログラムAB共に自分で開発しており、 >ファイルを開いて見れるアプリなのです。 プロセス間通信によりプログラムAからプログラムB にコマンドラインを送信し、 プログラムB側で、 受け取ったコマンドラインを解析して ファイルを開けば良いのでは? プロセス間通信は、WM_COPYDATAでも、 共有ファイルでもいいし、他にも名前付きパイプ等色々あります。 受け側では、プロセス間通信により 受け取ったコマンドラインを解析し、 ファイルを開く関数にファイル名を引き渡し、 開かせればよいのではないでしょうか? 自分で開発したプログラムなのですから ファイル名を引数で与えて開く関数は 作ってあるでしょう?

その他の回答 (3)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

> すでに起動しているプログラムB このプログラムBも kgyqk433さんが開発しているものですか? または、ソースがあり内容を変更できるのでしょうか どのようなものを想定しているのかをもう少し具体的にしたほうが的確な回答を得やすいかと思います たとえば 1) 自分で開発しているコンソール型のアプリ 2) 既存のWindows付属のメモ帳など GUI系のアプリ 3) 自分で開発している GUI系のアプリ

kgyqk433
質問者

お礼

私の言葉不足ですみません。。。 プログラムAでGetCommandLine()で取得したコマンドラインをプログラムBにコマンドラインとして渡したいのです。。 プログラムAに、「1のファイルを開け!というコマンドラインを渡し、プログラムAからそのコマンドラインをプログラムBに渡し、プログラムBからファイルを開くということがしたいのです。 言葉不足で大変もうしわけございません。 プログラムAB共に自分で開発しており、ファイルを開いて見れるアプリなのです。 お手数ですがよろしくお願いします。

  • BLK314
  • ベストアンサー率55% (84/152)
回答No.2

>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のデフォルトのウィンドウ・クラス名をそのまま流用していたり、   キャプションもアプリ名を省いたものに代えていたりとういう場合   ファイルベースがお勧めです

kgyqk433
質問者

お礼

私の言葉不足ですみません。。。 プログラムAでGetCommandLine()で取得したコマンドラインをプログラムBにコマンドラインとして渡したいのです。。 プログラムAに、「1のファイルを開け!というコマンドラインを渡し、プログラムAからそのコマンドラインをプログラムBに渡し、プログラムBからファイルを開くということがしたいのです。 言葉不足で大変もうしわけございません。

回答No.1

 こんばんは。  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で文字列を送信しても、容易に出来るのだそうです。

kgyqk433
質問者

お礼

私の言葉不足ですみません。。。 プログラムAでGetCommandLine()で取得したコマンドラインをプログラムBにコマンドラインとして渡したいのです。。 プログラムAに、「1のファイルを開け!というコマンドラインを渡し、プログラムAからそのコマンドラインをプログラムBに渡し、プログラムBからファイルを開くということがしたいのです。 言葉不足で大変もうしわけございません。

関連するQ&A

  • 他のアプリが起動しているプログラムの、コマンドラインを取得したい

    あるwinアプリ(1)が、コンソールプログラム(2)を起動中だとして、 他のwinアプリ(3)が、(1)が起動している(2)のコマンドラインパラメータを取得する方法はあるのでしょうか? もし、あるようでしたらその方法を、教えて頂けないでしょうか。 winアプリ(3)は、VC6作成の、win32APIアプリです。 よろしくお願い致します。

  • PocketPcでコマンドラインパラメータを取得したい。

    PocketPcでコマンドラインパラメータを取得したい。 現在、eMbedded Visual C++ 3.0を使い、PocketPc用のアプリケーションを作っています。 MFCは使わずにAPIオンリーです。開発PCはW2Kです。 ターゲットはCASSIOPEIA E800 ちょっとマイナー?ですが、産業用PDAです。 コマンドラインパラメータの値により動作が異なるようなアプリケーションを 作りたいのですが、コマンドラインパラメータの取得方法を教えてください。 自分で書いたコードでは、コマンドラインパラメータが1文字しか取得できません。 文字列変数と、ポインタ変数の2種類の方法で試してみたのですが、 どちらも結果は同じでした。 因みに、コマンドライン入力は、フリーのGS_Finderとゆうソフトで実現したいます。 (PocketPcではOS単体で、コマンドライン入力が出来ませんので) また、E800上でコマンドラインパラメータを受け取って動作するアプリケーションも 確認しています。 よろしくお願いします。 /****************** ソースはこんな感じです。 ******************/ char GlpCmdLine[20]; LPTSTR GloballpCmdLine; /*****Defines the entry point for the application.*************/ int WINAPI WinMain(  ・・・) { MSG msg; HACCEL hAccelTable; memset(GlpCmdLine,0x00,20); //初期化 strncpy (GlpCmdLine,(char*)lpCmdLine,20); CmdLineSave( GlpCmdLine ); // ファイルに保存(自作関数) GloballpCmdLine = GetCommandLine(); CmdLineSave( (char*)GloballpCmdLine ); // ファイルに保存(自作関数) ・ ・ ・ return msg.wParam; }

  • 「コマンドラインからプログラムを起動する」

    「コマンドラインからプログラムを起動する」ってどうやるのですか? 例えば、 http://d.hatena.ne.jp/language_and_engineering/20081028/1225160338 の(1) PATHを利用して起動のように、 taskmgr.exe を起動させたい場合、 どこにtaskmgr.exeを記載すればいいのでしょうか? コマンドプロンプトに張り付けて実行したら起動しましたが、 コマンドライン=コマンドプロンプトってことですか?

  • MFCアプリのコマンドラインでパラメータを使用した起動方法

    VisualC++6.0を用いて、ダイアログの2つあるプログラムを 作ったのですが、 2つのダイアログを例えばAさん用、Bさん用として使い分けようと思ったときに メニューでダイアログをそれぞれ指定して、実行しようと思ったのですが、 Aさん用を親ダイアログにしてしまうと、Bさんは起動時ごとにメニューで 切り替えなければいけなくなりますよね。 それで、切り替えをしなくても良いようにと思って、 コマンドラインからパラメータで「/A」「/B」などとしたときに、Aさん用 Bさん用として、起動させたいのですが、 コマンドラインのパラメータをどこで受け取って処理しているのか 分らないのですが、教えては頂けないでしょうか? よろしくお願い致します。

  • VC++でコマンドラインから引数を渡す方法

    さっきも違う質問でお世話になったものです。またわからないことがあったので、質問させてもらいます。 タイトルのとおりなんですが、現在Visual C++ 6でC言語の勉強をしてるんですが、コマンドラインから引数を渡すにはどうすればいいんでしょうか? main(int arfc,int *argv[]){ ・・・・ ・・・・} のようなプログラムなんですよ。 C言語もVC++の使い方をもよく分かってないので、詳しく教えてもらえるとうれしいです。 過去の質問も調べてみたんですが、似たような質問は見つかったんですが、わからなかったので、質問させてもらいました。 よろしくお願いします。

  • ファイルドラックでアプリを起動したら・・・(MFC)

    いつもお世話になっております Win98SE VC++6.0 MFC SDI formview ベースのアプリケーションを作っているのですが、 アプリケーションのアイコンに開くファイルをドラックしたら以下のエラーのダイアログがでて、コマンドライン引数が受けられないばかりかアプリケーションが止まってしまいます。 ------------------------------------------ Microsoft Visual C++ Runtime Library Runtime Error! Program : "実行ファイルの名前" abnormal program termination ------------------------------------- どこをいじってそうなってしまったのかわからないので困っています。 心当たりのあるかたアドバイスお願いいたします。 普通に起動して、開くコマンドでファイルを開くのは大丈夫です。

  • コマンドラインってなんですか?

    vbaの事を調べていると、ちらほら「コマンドライン」と言う言葉を見かけますが、 意味がよくわかりません。 コマンドプロンプトならわかります(笑) ググってみたら 「コマンドラインとはプログラムを起動させるときに指定するオプションのようなものです」 とヒットしたのですが、要は引数みたいな感じでしょうか?

  • VC++2005で外部プログラムを起動

    VC++2005EEを使って実行ファイルとは違うフォルダにある外部プログラムの起動をしようとしています。 System::Diagnostics::Process::Start を使って起動しようとしたら起動はしたのですが、本来その外部プログラムが読み取るデータ(外部プログラムと同じフォルダにあるデータ)を読み込んでくれません。 どうしてなのでしょうか?また、どうしたら正常に起動することができるのでしょうか? VC++はまだ始めたばかりでよくわかりませんが、よろしくおねがいします。

  • C++6.0 でCCommandLineのフラグを自分でつけたい

    お世話になります。 C++6.0でプログラムをしています。 (1)のプログラムから、(2)のプログラムを呼び出し、起動するときに (1)経由で(2)が起動されたという情報を(2)に渡したいのです。 そこで、「FilePrint:コマンド ラインに /p フラグが見つかったことを示します。」「FileDDE:コマンド ラインに /dde フラグが見つかったことを示します。」などのように独自でフラグを作りたいのですが、そのようなことは可能でしょうか?現在は、下記の CreateProcess文で(2)を呼び出しております NetworkExePath:(2)のパス GetCommandLine():(1)のコマンドラインをそのまま(2)に渡したいのです。 CreateProcess(NetworkExePath,GetCommandLine(),NULL,NULL,TRUE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi); 以上何卒よろしくお願いします。

  • 【VC++】MFC、C++/CLI(CLR)、C#の違い、及び、これからの展望

    いつも大変お世話になっています。 VC++初心者です。 VC++6.0(MFC)、VC++2005(CLR)(C++/CLI)(Express Edition)を 同時期に使い始めて何ヶ月か経ちました。 現在では、CLIの方が圧倒的に開発スピードが早く(扱いやすい)、 逆に、MFCの開発スピードが遅く(扱いにくい)、イライラしっぱなしです。 (CLIの開発では、WEBにあるC#のコードを参考にしながら、  コーディングしています。) そこで、何点か疑問に思ったので、ご回答頂けませんでしょうか。 (1)CLIとC#を区別した理由は何なのでしょうか。 (2)MFCはこれからも使われるのでしょうか。  (MFCで新規開発をすることは、まだまだ大勢なのでしょうか。) (3)VC++2005以降、MFCは有償らしいのですが、  VC++6.0(MFC)とVC++2005(MFC)は何か変わったのでしょうか。  (コーディングしやすくなっていますか?) (4)個人差はあると思いますが、開発スピードが一番早いのは、  CLR、C#、MFCのどれでしょうか。   すぐに返信ができないと思いますが、 宜しければ、ご回答頂けると幸いです。