コマンド入力を要する外部ソフトの起動方法 – プログラミング – Home

コマンド入力を要する外部ソフトの起動方...
 
通知
すべてクリア

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


maguro
 maguro
(@maguro)
ゲスト
結合: 21年前
投稿: 7
Topic starter  

ダイアログ上のボタンをクリックにより,外部アプリの起動を目的としています.
起動したい外部アプリは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
 maguro
(@maguro)
ゲスト
結合: 21年前
投稿: 7
Topic starter  

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


返信引用
ん
 ん
(@ん)
ゲスト
結合: 23年前
投稿: 106
 

_popen() は成功しているのでしょうか。
結構重要な点だと思うんですが、記述がないので。

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


返信引用
maguro
 maguro
(@maguro)
ゲスト
結合: 21年前
投稿: 7
Topic starter  

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

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


返信引用
瀬戸っぷ
 瀬戸っぷ
(@瀬戸っぷ)
ゲスト
結合: 22年前
投稿: 160
 

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

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

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

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

> #define GNUPLOT_PATH wgnuplot_p

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


返信引用
maguro
 maguro
(@maguro)
ゲスト
結合: 21年前
投稿: 7
Topic starter  

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

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


返信引用
瀬戸っぷ
 瀬戸っぷ
(@瀬戸っぷ)
ゲスト
結合: 22年前
投稿: 160
 

> どうも,やはり_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
 maguro
(@maguro)
ゲスト
結合: 21年前
投稿: 7
Topic starter  

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

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

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました