コマンド入力を要する外部ソフトの起動方法

[戻る]
maguro 2004/07/08(木) 15:23:41
ダイアログ上のボタンをクリックにより,外部アプリの起動を目的としています.
起動したい外部アプリはpgnuplotというグラフ作成ソフトなのですが,
これはDOS窓を介して起動するものです.
そこで,ボタンを押すことにより,以下の関数を実行するプログラムを作成したのですが,
ボタンを押すとプログラムが終了してしまい困っています.

{
#define    GNUPLOT_PATH "wgnuplot_p"
    FILE *gp;
    /* pgnuplotの起動*/
    if((gp = _popen(GNUPLOT_PATH, "w")) == NULL){
        fprintf(stderr, "not found %s.", GNUPLOT_PATH);
        exit(EXIT_FAILURE);
        }
    fprintf(gp, "set xrange [0:300]\n");fflush(gp);  /*コマンド入力1 */
    fprintf(gp, "set yrange [0:1000]\n");fflush(gp); /*コマンド入力2 */
    fprintf(gp, "plot 'test.dat' \n");fflush(gp);    /* コマンド入力3 */
    fprintf(gp, "pause -1 \"Press OK\"\n");          /* 確認ダイアログ */
    fflush(gp);
    _pclose(gp);
}

ソースからもわかりますように,この外部ソフトは起動後にプロンプトが表示され,そこへコマ
ンドを入力することにより,グラフ窓が表示されるものであります.
Win32コンソールアプリケーションではうまく動作しました.
Win32アプリではこのままの関数ではだめなのでしょうか.初心者ですみませんが,教えてくだ
さい.

maguro 2004/07/08(木) 15:28:34
また,初心者のため,元となるプログラムをCで記述しています.
したがって,極力C++を使用しないことを希望しています.
(VC++6.0,Windows2000)

2004/07/08(木) 15:37:03
_popen() は成功しているのでしょうか。
結構重要な点だと思うんですが、記述がないので。

あと、stderr への出力ってWin32アプリの場合、どこへ出力しにいくのでしょう?

maguro 2004/07/08(木) 17:44:16
いえ,お恥ずかしながらそこがわからないんです.
Win32コンソールアプリのソースをそのままWin32アプリへ流用してしまったもので・・.
仰るとおり,stderrの出力等は私の中で完全に無視してしまっています.
おそらく他の関数を使用しなければならないと思うのですが.

良いアイデアがあれば引き続きお願いいたします.

瀬戸っぷ [E-Mail] 2004/07/09(金) 09:58:28
> あと、stderr への出力ってWin32アプリの場合、どこへ出力しにいくのでしょう?

WinMain()で下記のようなコトをしてみました。
    STARTUPINFO Start;
    Start.cb = sizeof(STARTUPINFO);
    GetStartupInfo(&Start);
Start.hStdErrorはNULLでしたので…多分出力は捨てられているかと。

> おそらく他の関数を使用しなければならないと思うのですが.

MessageBox()を使うとか…
デバッガ使用中ならばOutputDebugString()でもよろしいかと。

> #define    GNUPLOT_PATH "wgnuplot_p"

拡張子とかないですが、起動できるんでしょうか?
あと、カレントパス(かPATHの通った場所)にないと起動できないかと…

maguro 2004/07/09(金) 15:01:09
瀬戸っぷさん
>拡張子とかないですが、起動できるんでしょうか?
>あと、カレントパス(かPATHの通った場所)にないと起動できないかと…

p_gnuplotはカレントパスに置いています.
どうも,やはり_popenがまずいみたいなのですが,
p_gnuplot起動後に必ずコマンドを入力しなければグラフ表示ができないため,
これ以外の関数による外部アプリの起動法が思いつきません.
どのようにしたらよいでしょう・・.

瀬戸っぷ [E-Mail] 2004/07/09(金) 15:53:45
> どうも,やはり_popenがまずいみたいなのですが,

手元ので試してみました。
_popen()でエラーになりますね。

> これ以外の関数による外部アプリの起動法が思いつきません.
> どのようにしたらよいでしょう・・.

自前でパイプを作成(CreatePipe())して、STARTUPINFOに設定、
CreateProcess()で起動して、パイプに対してWriteFile()で書き出す…
というカタチになるかと。

http://www.fides.dti.ne.jp/~tokai/vc/vcchips1.html#5
とか、
http://nhiro4.ld.infoseek.co.jp/program/windows/pipe.html
とかが参考になるかと。

maguro 2004/07/12(月) 09:18:27
数々のご助言ありがとうございました.
パイプを作成する方法もやってみたのですが,どうもダイアログ上では,
dir等のdos命令は受け付けるのですが,pgnuplotの起動はできないようでした.

そこで,
shellExecute()を使用し,第3引数にコマンドを記述したテキストファイルをリードするよう
に設定することで起動ができました.

但し,起動したソフトの初期画面が大きすぎるようです.
shellExecute()による外部アプリ起動時にその大きさ,あるいは表示する場所を指定すること
ができれば完璧なのですが・・.

最初の質問事項とは異なりますが,解決方法があれば教えてください.
よろしくお願いします.

古いスレッドには追加発言できません。