VC++6.0,MFCでPATHを効かせてコマンド実行する方法

このQ&Aのポイント
  • VC++6.0,MFCでコンソールコンパイラランチャのアプリケーションを作っています。コンパイラのパスを設定する方法と、パラメータ付きでコンパイルコマンドを実行する方法について教えてください。
  • ShellExecuteを使った方法では、1.のパス設定が2回目のShellでは無効になってしまいます。vc++6.0,MFCでパスを効かせてコマンドを実行する良い方法はありますか?
  • 質問者はVC++6.0,MFCでコンソールコンパイラランチャのアプリケーションを作成中で、コンパイラのパス設定とパラメータ付きでのコンパイルコマンド実行方法について困っています。ShellExecuteを使用する方法ではパス設定が2回目のShell実行時に無効になってしまうため、別の良い方法を教えてください。
回答を見る
  • ベストアンサー

PATHを効かせてコマンド実行したい

コンソールコンパイラランチャのアプリケーションを作っているのですが、 command.comの設定でつまずいてしまいました。 やりたいことは 1.コンパイラのパスを設定する 2.コンパイルコマンドをパラメータ付きで実行する の2ステップなんですが、ShellExecuteを使って別々なら出来るんですけど、 下記の方法では1.のパス設定が2回目のShellでは無効になってしまいます。 なにか良い方法はないでしょうか? ShellExecute(NULL,"open","command.com", "/c set PATH=%PATH%"+m_strCompPath,NULL,SW_SHOW); ShellExecute(NULL,"open","command.com", "/k "+CommandString,NULL,SW_SHOW); 環境はVC++6.0,MFCです。

  • ystk
  • お礼率83% (55/66)

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

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.2

こんな感じかなあ。 PROCESS_INFORMATION pi; STARTUPINFO si; memset(&si, 0, sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_SHOWNORMAL; char* cmd = "コマンドの引数"; // "/k ..." って感じの char* env = "PATH=XXXXX"; CreateProcess("command.com", cmd, NULL, NULL, FALSE, 0, env, NULL, &si, &pi); # 実際に動かしたわけではないので、「自信なし」としておきます (^^;

ystk
質問者

お礼

アドバイスありがとうございました。 お礼が遅れ、申し訳ありませんでした。 実はまだ、実現出来てないのですが、何とかがんばってやってみます。

ystk
質問者

補足

わざわざコードまで教えていただきありがとうございます。 しかし苦戦しております。 いろいろやってみたんですけどPATHが変わってくれません。(ToT) char* cmd = "/k PATH"; char* env = "PATH=c:\\data"; CreateProcess("command.com",cmd, NULL, NULL, FALSE, 0, env, NULL, &si, &pi); ・・・だとDos窓が開きませんでした CreateProcess(NULL,"command.com /k path ", NULL, NULL, FALSE, 0, env, NULL, &si, &pi); にしてみたところDos窓が起動しますが表示されるPATHはデフォルトのままです。 なにがいけないのでしょうか? いろいろ検索してみたのですがCreateProcessでも環境変数まで設定しているのが見つかりません。 どうか宜しくお願いします。

その他の回答 (1)

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.1

CreateProcess() API を使えば、7番目の引数で環境変数を指定できます。

ystk
質問者

お礼

アドバイスありがとうございました。 お礼が遅れ、申し訳ありませんでした。 実はまだ、実現出来てないのですが、何とかがんばってやってみます。

ystk
質問者

補足

早速の回答ありがとうございます。 CreateProcessでやってみます。 うまく出来たらまた報告いたします。

関連するQ&A

  • ShellExecuteでDOSコマンド実行したら...

    VC++6.0においてShellExecuteでDOS窓をたち上げてコマンドを 実行したいのですが、うまくいきません。 1.ShellExecute(m_hWnd,"open","command.com","dir",NULL,SW_SHOW); ...とすると”指定された COMMAND 検索ディレクトリが違います.”となり、 なにも実行されません。 2.ShellExecute(m_hWnd,"open","command.com","dir /?",NULL,SW_SHOW); ...とするとちゃんとdirのヘルプが表示されますが、すぐに窓が閉じます。 3.ShellExecute(m_hWnd,"open","command.com","dir /? > out.txt",NULL,SW_SHOW); ...としてもファイルが作られず、2.と全く同じ結果になってしまいます。 これはどうしてこのような現象が起きるのでしょうか? DOSプロンプトをたち上げて同様なコマンドを実行した場合はちゃんと期待通りの結果が得られます。 あと、DOS窓が閉じないようにするにはどうすればいいのでしょうか?

  • ShellExecuteのコマンドについて

    すみません、どなたか教えてください。 下記のコマンドですが、 ShellExecute(null,"open","cmd.exe","実行したいもの",NULL,SW_HIDE); "実行したいもの" の書き方なんですが、 "/c c:\\work\\test.bat" のように書くと、cmd.exeにtest.batを実行させることができたんですが、 実行したいtest.batが指定できず、変数でセットする場合の書き方が分かりません。 ShellExecute(null,"open","cmd.exe","/c c:\\work\\test.bat",NULL,SW_HIDE); ↓ ShellExecute(null,"open","cmd.exe","/c c:\\work\\ "" & 変数 & "",NULL,SW_HIDE); こんな感じだと思うのですが、変数をダブルクォーテーションで囲むときに、ダブルクォーテーションをいくつ重ねるのかが分かりません。ググっているのですが、どこを調べていいのか分からず、はまっています。どなかたアドバイスお願いします。C++です。

  • ShellExecuteをつかって・・・

    もしかしたら非常に簡単な問題かもしれないんですけど、 SDIベースでShellExecuteをつかって以下のような関数を作ってコンパイルすると、 ”error C2065: 'm_hWnd' : 定義されていない識別子です。” がでます。 前に別プロジェクトでやったときは特に定義せず使えたような気がするのですが、 何か使い方が間違っているのでしょうか? #include "stdafx.h" #include "FCwin.h" #include "MainFrm.h" #include "FCwinDoc.h" #include "FCwinView.h" ・・・中略・・・ int CFCwinApp::DosFcExe() { HINSTANCE ret = ShellExecute(m_hWnd,"open","command.com",NULL,"c:\\",SW_SHOW); if((int)ret <= 32 ){AfxMessageBox("DOS窓開けません",MB_OK);return 1;} return 0; }

  • VC++からブラウザを起動して・・・

    VC++&MFCで画面を作成しています。 作成した画面のあるボタンをクリックすると、規定のブラウザが起動され、 指定したURLを表示にいくという処理を行いたいので、 ShellExecute( NULL, "open", "http://xxx.xxx.co.jp/", NULL, NULL, SW_SHOWNORMAL ); という様な感じでブラウザを起動しているのですが、このブラウザの起動時に、 アドレスバー・ツールバー等を非表示にしたいのです。 ShellExecute()じゃなくても良いので、VC++(SDK、MFC何でも可)で 実現する方法はあるのでしょうか?。 よろしくお願いします。

  • CreateProcessでの環境変数の設定の仕方

    PATHを設定してCommand.comを実行したいのですが、 CreateProcessでの環境変数の設定の仕方がわかりません char* env = "PATH=c:\\data"; CreateProcess(NULL,"command.com /k path ", NULL, NULL, FALSE, 0, env, NULL, &si, &pi); このようにしてみたところDos窓が起動しますが、 表示されるPATHはデフォルトのままです。 環境は VC++6.0 MFC です。 どうか宜しくお願いします。

  • ShellExecuteで外部アプリを起動したい

    こんにちは。 ShellExecuteを使って外部アプリを起動するために、 ShellExecute(NULL,NULL,"Program Files/XWaveClient/XWavePDA.exe",NULL,NULL,SW_SHOWNORMAL); というコードをかいているのですが、この行で  error C2065: 'ShellExecute' : undeclared identifier というコンパイルエラーがでてしまい、困っています。 ShellExecuteを使うためにはなにかヘッダファイルを includeしなくてはならないのでしょうか? 環境は、eVC++4.0です。 よろしくお願い致します。

  • VC++ Express m_hWnd

    VC++ Express edition 2008で、Command Promptを起動、directoryを替えようとして、 HINSTANCE ret = ShellExecute(m_hWnd,"open","cmd.exe",NULL,"c:\\Program Files",SW_SHOW) で、m_hWndが定義されていないとエラーが出てきました。VC++2005 standard version では出るようですが、Express edition 2008では定義されてないようです。この部分、Expression editionではどのように定義するのか教えてください。2008 Express editionで別の変数が適当であれば、そちらを教えていただけませんか?

  • VC++ で.bat起動

    また、こちらを使わせていただきます。 VC++で.batファイルを起動しようとしていますが、cmdはあくのですが、.batが起動しません。他の参考にしてますが、なかなかたどり着きません。どなたか、アドバイスお願いいたします。 .bat fileは次のとおりです。 cd\Program Files\Wireshark> tshark -i.2 greater 170 -a duration:2 -w.... tshark -v-r e:\Test\test5.pcap.... VC++は次のとおり void CStartupapplicationView::OnBnClickedButtontest() { //cmdは、ShellExecuteでも、CreateProcessでも開けられますが、 //bat fileの起動がうまくいきません。 HINSTANCE ret = ShellExecute(m_hWnd,"open","cmd.exe",NULL,"c:\\Program Files\\Wireshark",SW_SHOWNORMAL); ShellExecute(m_hWnd,"open","c:Program Files\\Wireshark\\test.bat",SW_SHOW); //.batファイルは、c:Program Files\Wiresharkの下に入っています。//が、.Batは起動しません。 if (ret <= (HINSTANCE)32) AfxMessageBox("can not Shell.",MB_OK); //別の方法 STARTUPINFO sinfo; PROCESS_INFORMATION pinfo; ZeroMemory(&sinfo,sizeof(STARTUPINFO)); ZeroMemory(&pinfo,sizeof(PROCESS_INFORMATION)); sinfo.cb=sizeof (STARTUPINFO); sinfo.dwFlags=STARTF_USESHOWWINDOW; sinfo.wShowWindow=SW_SHOWNORMAL; if(!CreateProcess(NULL,_T("cmd.exe c:\\test2.bat "), // test2.batは、Document and settings/----------- //Startup applicationの下にはいっていますが、起動しません。 NULL, NULL, FALSE, 0, NULL, NULL, &sinfo, &pinfo)); {//起動失敗 } //

  • 98でBorlandC++5.51でメール送信させるため

    ShellExecute(NULL, "open", "mailto:****@abcdefg.com?subject=件名&body=本文。", NULL, NULL, SW_SHOWNORMAL); としたのですがこれだとメールウィンドウが最大化されずまた前面表示されない場合があります どうしたら最大化と確実な前面表示を実現できるでしょうか?

  • 任意のIEにリンクを指定したいです

    2つのIEが起動しており、そのうち指定するIEの方にリンク先を上書きする方法をご教授頂ければと思います。 環境はVisual C++ 2005 Express Editionのwin32コンソールで作成しています。 IEを起動する方法として、FindWindow関数で上書きしたいIEのウィンドウ名のハンドルを取得し、ShellExecute関数でそのハンドルにリンク先を指定する方法を取っています。 下記は作成したプログラムです。 確かに指定したウィンドウ名を参照し、hWndにNULL以外の値が入っておるのですが、URLを上書きするウィンドウが指定したウィンドウではなく、最後に起動したIEのウィンドウに表示されてしまいます・・・。 説明べたなので例を示します・・・。以下のような動作になります。 (1)作成したプログラムからIEを起動する。ウィンドウ名:test - Windows Internet Explorer (2)デスクトップから新規にIEを起動する。ウィンドウ名:yahoo - Windows Internet Explorer (3)もう一度作成したプログラムからIEを起動すると、(2)で起動したIEに上書きしてしまう。本当は(1)に上書きしたいのに・・・。 また、ShellExecuteの第一引数はそのハンドルを持つウィンドウを差していると認識しているのですが、違いますでしょうか? /////////////////////////////////////////////////// HWND hWnd = FindWindow( NULL, "ウィンドウ名") ); if ( hWnd != NULL ) {   ShellExecute( hWnd, "Open", URL, NULL, NULL, SW_SHOW ); } else {   ShellExecute( NULL, "Open", "IExplore",​ URL, NULL, SW_SHOW ); } ///////////////////////////////////////////////////

専門家に質問してみよう