VC++6.0で複数の外部プログラムを起動 / 終了させる

このQ&Aのポイント
  • VC++6.0でINIファイルに記述された複数の外部プログラムを起動・終了させる方法を知りたい
  • WM_DESTROYでプログラムを終了させることはできるが、複数回行う方法はあるか
  • 起動した外部プログラムを最前面に表示させずにアクティブにする方法を知りたい
回答を見る
  • ベストアンサー

VC++6.0で複数の外部プログラムを起動 / 終了させる

現在、VC++6.0でプログラムを起動時にINIファイルに 記述されたパスから複数の外部プログラムを起動して、 プログラムの終了時にその起動したプログラムをすべて 終了させるプログラムを作成しようとしているのですが 良い処理方法が思い浮かびません。 いろいろ調べている内に以下のようなページは見つけ ました。 http://www.asahi-net.or.jp/~yy6m-wd/kuma/vctip/proces.htm#terminate 下の二行をWM_DESTROYで処理させることにより一つの プログラムなら終了させることは出来ました。 これを複数回行う方法はないものでしょうか? (WM_CREATEで複数のプログラムを起動して起動した すべてのプロセスの終了コードを取得する方法) リスト構造体に格納しようとしましたがなぜか強制終了 してしまいます。(^_^; あと、ShellExecute関数のように起動したプログラムを 最前面に表示させないこと(アクティブにさせない)は できませんか? (SW_SHOWNOACTIVATEかSW_SHOWNA) もしかするとSTARTUPINFO 構造体で指定できそうな 感じですが・・・。 よろしくお願いします。

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

  • ベストアンサー
  • terra5
  • ベストアンサー率34% (574/1662)
回答No.1

PROCESS_INFORMATIONをプロセス毎に用意していればできるはずですが。 >リスト構造体に格納しようとしましたがなぜか強制終了 >してしまいます。(^_^; コードがないのでわかりませんが、ここに間違いがあるのでは? >もしかするとSTARTUPINFO 構造体で指定できそうな >感じですが・・・。 できます。

pick52
質問者

お礼

なんか、 #pragma comment(linker, "/entry:\"main\"") (#pragma comment(linker, "/entry:\"WinMain\"") ) が問題だったようです。 これをコメントアウトしたら動作しました。 スタートアップルーチンで何かCreateProcess用の処理を しているんでしょうか? プログラムサイズを小さくするために最近は殆どのプログラムに 入れていたので失敗しました。(^_^; どうもお騒がせしました。 STARTUPINFO 構造体のサンプルをお待ちしています。(_ _)

pick52
質問者

補足

えっと、たぶんやり方が悪いだけだと思うんですが正しい 方法が分からないので教えてほしいんです。 http://www.asahi-net.or.jp/~yy6m-wd/kuma/vctip/proces.htm#terminatehttp://www.kumei.ne.jp/c_lang/intro/no_34.htm を参考にサンプルソース書きました。 http://www.geocities.jp/customcgi/CreateProcess.c.html すごく初歩的なミスなのではないかと思いますが・・・。 > >もしかするとSTARTUPINFO 構造体で指定できそうな > >感じですが・・・。 > できます。 よろしければ、サンプルを書いて頂けませんでしょうか? または、サンプルのあるページのURLだけでもいいです。

その他の回答 (1)

  • terra5
  • ベストアンサー率34% (574/1662)
回答No.2

>#pragma comment(linker, "/entry:\"main\"") 何をやっているのか理解していないなら、むやみにスタートアップを外さないほうがいいでしょう。 これが落ちます。 #include <stdio.h> int main(int argc,char *argv[]){ printf("Hello.\n"); } この場合、標準出力を使えるようにするのがCのライブラリのスタートアップなので、それを外すと未初期化のため落ちます。 わからなければ、Cのライブラリを使っている場合はやめておきましょう。 >よろしければ、サンプルを書いて頂けませんでしょうか? 単に代入するだけですから、これぐらいSTARTUPINFOを調べればすぐわかると思うんですが(^^; http://www.geocities.jp/customcgi/CreateProcess.c.html にこれを追加してください。 a->si.dwFlags = STARTF_USESHOWWINDOW; a->si.wShowWindow = SW_SHOWNOACTIVATE;

pick52
質問者

お礼

本当にそうですね。 うっかりしていました。 また、STARTUPINFO 構造体に関しては書いた後に過去 ログとか気がついて見てみたら解決してしまいました。 (お礼と補足が二つとも埋まっていたので訂正できず にいました) ただし、何故か非アクティブなのに全面に表示されて しまうなど問題があったため、別の方法(SetForegroundWindow)で 強制的に現在のウィンドウをアクティブに戻すように しました。 お手数かけて済みませんでした。(_ _)

関連するQ&A

  • 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)); {//起動失敗 } //

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

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

  • エクスプローラの終了と再起動をするには?

    プログラムから『エクスプローラ』を一度終了して、再び起動させる方法を探しています。 私の考えでいくと WM_CLOSE というメッセージを送れば『エクスプローラ』を一度終了させられると 思っていますが、そのためにはウインドウ・ハンドルが必要ですよね。 問題はどうやって『ウインドウ・ハンドル』を取得するかということです。 ここの部分がよく分からないため質問します。 『エクスプローラ』を終了すべく大本の『エクスプローラ』のウインドウ・ハンドルを どうやって取得すればよいのか、ご存知の方がいましたら私に教えてくれませんか? また、WM_CLOSE メッセージ以外でもっとよい方法や、別の方法があれば複数の方法を より多く知りたいと思っていますので、たくさんのアイデア(終了と再起動)などを 教えて下さい。また、再起動は単に『エクスプローラ』を起動すればよいのですよね? よろしくお願いします。

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

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

  • Shellで起動したGnuplotを終了させるには

    VC++6.0からShellExecuteを使ってwgnuplot.exeと言うフリーのグラフ作成 プログラムを起動させています。 使い終わったらVCから終了させいのですが方法が解りません。 パイプ機能を使うと出来そうなのですが他に簡単な方法はないでしょうか。

  • 【VC2005】外部から呼ばれた複数のVCのEXEからそれぞれ1つのみのダイアログを出す方法

    VC超超初心者です。 タイトルの件、今までうんうん考えましたが、独力では厳しいので よい知恵(コーディング)を教えて頂けませんでしょうか? ************************************************ やりたいこと: ・プログラムAから、ShellExecute()を利用して、プログラムBを  複数起動します。(現在、このプログラムBをコーディング中です。) ・プログラムBにあるボタンを押して、  1つだけのダイアログCを出力させたいです。 (呼び出し元のプログラムBから自分の呼び出したダイアログCを  操作(拡大、閉じるなど)をしたいです。) 条件: ・プログラムBはモードレスでダイアログCを呼び出したいです。 ・プログラムBがダイアログCを既に呼び出していれば、ボタンをクリック  してもカウントせず、新たにダイアログCはつくりません。  (プログラムBの他のボタンは有効とします。) ・プログラムBで自分の呼び出したダイアログCが閉じられれば、  再度ボタンを押して、ダイアログCを呼び出せます。 ・複数のプログラムBが起動している場合、プログラムBは自分が  呼び出したダイアログCのみをコントロールします。 ************************************************ 私の環境 ・OS:WindowsXP pro ・VC2005 Express Edition ・プロジェクト種類:CLR お手数ですが、詳しい方いましたら、ご協力お願いします。

  • VC++6.0からIEの起動ができない

    つぎのようなCodeを書きましたが、コメント行のようなnotepad.exeを指定すると起動できるのですがブラウザIE(iexplore.exe)を指定すると起動しません。  省略 STARTUPINFO si; PROCESS_INFORMATION pi; char buf[256]; LPTSTR lpCommandLine; strcpy(lpCommandLine,"iexplore.exe d:\\data\\update.html");  //strcpy(lpCommandLine,"notepad.exe d:\\data\\update.html");  //  strcpy(buf,lpCommandLine); ZeroMemory( &si, sizeof( STARTUPINFO )); si.cb = sizeof( STARTUPINFO ); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_SHOWNORMAL; BOOL t=CreateProcess( NULL, lpCommandLine, // コマンドライン文字列 NULL,NULL,FALSE, 0, NULL, NULL, &si, &pi)) // //起動したプロセスの終了を待たない場合 CloseHandle(pi.hThread); CloseHandle(pi.hProcess); :  省略 なを、「スタート」メニューの「ファイル名を指定して実行」に「iexplore.exe d:\data\update.html」を指定すれば起動します。 以上です。よろしくお願いします。

  • 複数プログラムの同時起動のやり方を教えてください。

    Aというプログラムを実行したときに同時にBというプログラムも 実行するやり方を教えてください。(終了も) 今はフリーソフトのものを使ってますが実行終了ともにそのソフトの ショートカットを使うもので実行はまだいいのですが 終了させるときにデスクトップに戻ってショートカットを 押さなくてはなりません。 なのでプログラム(A)自体を起動(終了)させたときに Bのものも同時に行う方法がありますでしょうか? 自分は全くプログラムのことはわかりませんが Aのプログラムに他のプログラムも同時に起動(終了)させる というパッチ?をあてることは出来ますでしょうか? 出来るようならその方法を教えてください。 お願いいたします。

  • 一定時間ごとにプログラムを起動させるプログラムを作りたい

    「一定時間ごとにプログラムを起動させる」プログラムを、 作成したいと考えております。 #include <windows.h> #include <stdio.h> void CALLBACK kidou() { char pass[255]; sprintf(pass,"./test1.exe"); ShellExecute(NULL, NULL, pass, NULL, NULL, SW_SHOWNORMAL); } void main() { SetTimer(NULL,1,1000,kidou); } この様な感じで作成しましたが、「test.exe」を起動できませんでした。 どのような修正をしたら良いのか教えていただけないでしょうか?

  • 【VC++6.0】外部exeを2つだけ起動させたいのですが・・・

    現在VC++6.0を使用して、外部exeを起動させようとしていますが、 なかなかうまくいきません。 詳しい方いましたら、具体例を踏まえて教えて頂けませんでしょうか?? (本当にお願いします。) (私自身、C言語はなんとなくわかっているつもり(学生レベルの下)  ですが、VC++になって現在更に混乱しています。) (返事はちょっと遅れますが、必ずしますのでお願いします。) ************************************************************** 【やりたいこと(例で紹介します)】 ・ボタンを押して、1つのcalc.exeを立ち上げられるようにします。 ・更にボタンを押せば、calc.exeが2つまで立ち上がることは許可します。(3つ以上はだめ) ・立ち上がっていたcalc.exeが一度終了し、更にボタンを押せば、  クリックの回数分上限2つまでcalc.exeを立ち上げます。 【条件】 ・2つまでcalc.exeが立ち上がっていれば、ボタンを押したことをカウントしないとします。 ・起動もとのVC++のプログラム上の他のボタンは有効とします。 ************************************************************** 私の環境: Windows XP proで、VC++6.0を利用してます。 希望: ・できれば、Shellexecuteを使いたいです。 ・プロセスはあまり・・・(ネットで具体例をみましたが、全く使いこなせませんでした。) 以上、よろしくお願いします。

専門家に質問してみよう