こんばんは。
外部アプリケーションのコマンドプロンプトを起動させてコンパイル後、Windowsアプリケーシ
ョンを表示させたいのですが、できなくて困ってます。。。
環境はvisual studio .netでC++で記述しています。
バッチファイルを適用するところまでは、以下のような形でできます。
if ( !CreateProcess( NULL,
_T(cmd.exe /k \C:\\…\\vcvars32.bat\"),
第3引数,4,5,6.....){
//以下、失敗処理
}
その後のコンパイルするファイル(A.cpp)をどうにかして引数として渡したいのですが、以下の
方法ではうまくいきません。
×:cmd.exe /k \C:\\…\\vcvars32.bat\ cl \C:\\...A.cpp\ user32.lib
他にも上記と似たような方法を試したのですが、どれも失敗です。
もうコマンドプロンプトに手書きでファイルを記述するしか方法が思いつきません。
どうしたらいいでしょうか?
どなたかご助力お願いします。
そもそもフツーにコマンドラインから手打ちで
cmd /k vcvars32.bat cl ...
って入力してもコンパイラは起動しないのだし、無理っす。
別の方法を考えるほうが吉。
vcvars32.bat なんざ中身は set しかしてないんだから、単純に読み取って
適切に putenv するだけでしょ。
# と、無責任なことを言ってみるテスト
バッチファイル(またはメイクファイル)をテンポラリファイルに出力して、
それを実行するという方法はいかがですか?
難しくバッチファイルなんて考えず
単純にCreateProcessで起動したcmd.exeに対し、コマンドライン
そのものを送ればよいのでは?
パイプで読み書きでできると思います。
手打ちで動くなら同じことが出来るはずです。
一つのコマンドプロンプトに複数のコマンドラインを実行させたいのならバッチファイ
ルかパイプでしょうね。
パイプのほうが汎用性はありますし、余分なファイルは要りませんが、パイプに関し
て調べる必要があります。
それが嫌ならバッチファイルを作ってそれを実行するぐらいですかね。
putenvするとなるとテキストファイル読み取る処理が要るので無駄に面倒だと思
います。
まぁそれも、いい練習になりそうですけどね。
実行させるだけでいいなら、「ShellExecute」でいいと思います。
まず、
1.「vcvars32.bat」を起動する。
2. コンパイル手順を記述したバッチファイルを実行する。
3. エラーがなければ、プログラム実行。
でどうでしょうか。
>実行させるだけでいいなら、「ShellExecute」でいいと思います。
それですと、vcvars32.batを実行したプロセスとコンパイルに使うプロセスが違った
りしそうですが、そうすると環境変数って引き継がれないような気がします。
どうでしたっけ?
それと、バッチファイルでやるならそっちでvcvars32.bat実行すればいいだけの話
です。
>それですと、vcvars32.batを実行したプロセスとコンパイルに使うプロセスが違った
>りしそうですが、そうすると環境変数って引き継がれないような気がします。
そうですね。
「ShellExecute」を使う時は、vcvars32.batを実行した後続けてコンパイルも
行わないと駄目ですね。
二日間、音沙汰なくて申し訳ありません。
まずパイプの勉強から始めていろいろと頑張っていたのですが、なかなかうまくいかなくて、次
に「ShellExecute」とバッチファイルを用いて試行錯誤した結果、プログラムを起動すること
に成功しました。
様々な助言をしてくれた方々に心から感謝します。とても多くのことを学べました。
本当にありがとうございました。