• ベストアンサー

CreateProcessでコンソールアプリケーションを起動するには

コンソールアプリケーションの中で、CreateProcess関数を用いて、自分自身のアプリケーションを起動したところ、次の結果になりました。 ・CreateProcess関数自体は成功する ・タスクマネージャで確認すると自分自身が2つ起動されている ただし、コンソールアプリケーションのウィンドウは1つしか開かず、そのウィンドウを2つのアプリケーションで共有しているかのように動作します(printfによるメッセージが2重に表示されるなど)。 使用言語はVC++ .NET 2008で、デバッガによる動作をさせています。 詳しい方、宜しくお願いします。

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

  • ベストアンサー
  • titokani
  • ベストアンサー率19% (341/1726)
回答No.2

dwCreationFlagsにCREATE_NEW_CONSOLEを指定するとどうなりますでしょうか。

_hitoshi_
質問者

お礼

お礼が遅れてすみません。 おっしゃる通りの方法でうまくいきました。 ありがとうございました。

その他の回答 (1)

  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

VC++上で実行すると自動でコマンドプロンプトが開くので誤解されてるようですがコマンドプロンプトとプログラムは別のものです 普通はコマンドプロンプトを起動させそこからプログラム名を打ち込んでプログラムを起動させます CreateProcessでコマンドプロンプト画面は作られません

_hitoshi_
質問者

お礼

お礼が遅れ申し訳ありません。 引数dwCreationFlagsにCREATE_NEW_CONSOLEを指定したら2つの画面を作れました。 回答ありがとうございました。

関連するQ&A

  • CreateProcessについて

    VC++6.0を使用し、NT上で以下のようなプログラムを作成していました。 Prcess_sts = ::CreateProcess(***_FULLPATH, NULL, NULL, NULL, FALSE, 0, NULL, ***_DIR, &pscinfo, &lpProcessInfo ); ***は起動する実行形名称です。作成したプログラムをNT上で動作させるには全く問題なかったのですが、OSがXPに変わった途端、この命令でアプリケーションの起動ができなくなりました。具体的な症状は、 ・カーソルは砂時計を表示し、フリーズしている ・タスクマネージャの『プロセス』を確認すると、99%がアイドル状態で、起動したアプリ及びCallしたアプリがリソースを食い潰している状態ではない。 という変な現象が発生しています。ちなみに、このような状態になるのは、コールしたプログラムの先でシリアル通信を行うものに頻発しているように感じます(気のせいかも?)また、全く問題なく起動することもあります。これはOSのせいなのでしょうか?もちろん、NT上で動作させていたときは全くなかった現象です。VC++がXPに対応していないからなのでしょうか?全く分からずに困っています。その道に明るい方がいましたら、ご教示ください。 PS マイクロソフトが発表している『32ビットプロセスでCreateProcess関数を呼び出しても正しく起動されない』というものとは違うようです。 よろしくお願いします。

  • 外部アプリケーションの起動について

    Windows 7 32ビット機で、VC++ 2010 Express を利用して Windowsフォームアプリケーションを作成しております。文字コードはマルチバイト文字を選択しました。 アプリケーション自体は、メニュー画面にいくつかのボタンを設け、押下すると所定の実行ファイルが起動するといった非常に簡単なものです。 外部アプリケーションの起動方法ですが、ShellExecute()関数またはCreateProcess()関数を使用するのが一般的との事ですので、今回はCreateProces()関数を使うことにしました。大きな理由は、アプリケーションの実行待機機能が使いたかったためです。 とくに問題なくビルドが完了し実行してみたところ、殆どのアプリケーションは起動できるのですが、ひとつだけ起動できないものがありました。正確には、起動できないというよりは、タスクマネージャーにより起動されていることは確認できるのですが、バックグラウンドで動作するかのように肝心の画面が表示されません。 この状態になると(主プロセスである?)メニュー画面の制御がきかず(応答なし状態)、タスクマネージャーにより強制終了すると、ここでやっと表示されなかった画面が表示されるといった具合です。 何故このような現象が起こるのか、どのようにすれば解決するのかわかりません。誠に恐れ入りますがご教示賜りたく、何卒よろしくお願いいたします。 なお、下記にご参考となり得る情報を記載します。 1. 関数部分の記述は以下のとおりです。 rVal = CreateProcess ((LPTSTR)Fname, NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); Fnameは、フルパスのファイル名がセットされたchar型変数で、ここでは第1引数に記述していますが、第2引数に記述した場合でも結果は同じです。 2. 上記の(LPTSTR)の記述はおまじない的なもので、この記述が無くても挙動は変わりません。どこかの記事で、Windows 7 で動作しない場合の対応と紹介されていましたので。 3. 実行ファイルは、R社のプリンタドライバーのインストーラ(.exe)です。 4. Z社のプリンタドライバーのインストーラやその他のアプリケーション(.exe)は問題なく動作します。 5. メニュー画面には複数のボタンがありますが、対応するロジックはすべて同じで、Fnameにセットされた値のみ異なります。 6. ShellExecute()関数を利用すると、問題なく動作します。

  • コンソールアプリケーションの終了方法

    コンソールアプリケーションをC言語(Visual-C++6.0)にて開発予定です。このアプリケーションは画面を使わないのでコンソールアプリケーションにする予定です。このプログラムは常駐プロセスにし、コマンドで起動停止を行うようにする予定です。プログラムの起動はバッチファイルを作成し、そこから実行しようと考えていますが、プログラムを停止させるバッチファイルのイメージがわきません。unixの場合は、当該プロセスにSIGTERMを送信する等の方法が考えられるのですが、windowsで常駐のコンソールアプリケーションを停止させるには、どのような方法があるのでしょうか。ご存じの方ありましたら、教えてください。停止させる方法は、外部から常駐プロセスに停止である旨の何らかの事象を送り、それを常駐プロセスがキャッチし、自ら停止することを想定しています。(有無をいわさず殺すことは考えていません) 実行環境:windows2003を想定 開発言語:VC++6.0でC言語

  • アプリケーション起動について

    ひろと申します。 クライアントからサーバの共有フォルダにある、他のアプリケーションを オプション付きで起動させるプログラムをVC++で作成したのですが、 クライアントがNTだとうまくいきません。 たとえば、サーバ上にあるapp.exeを「app.exe /i」のような感じで 起動すると、クライアントがwin98の場合はアプリケーションが 表示されるのですが、NTから起動させようとすると、 アプリケーションは表示されません。 また、オプションを外すとアプリケーションは NTでも表示されます。 APIは、WinExec,ShellExecuteEx,CreateProcessで試したのですが 同じ結果でした。 CreateProcess は以下のように設定してます。 ------------------------------------------------------------------ STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(STARTUPINFO)); ZeroMemory(&pi, sizeof(PROCESS_INFORMATION)); si.cb = sizeof(STARTUPINFO); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_SHOWNORMAL; CreateProcess(NULL, "serverpath\\app.exe /i", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); プロセスの起動は成功していうようです。 クライアントがNTの場合、他に必要な設定があるのでしょうか? よろしくお願いします。

  • CreateProcess関数について

    ■CreateProcess関数で実行フアイル(.exe)を呼ぶプログラムを作成しています。 ■CreateProcess関数はプロセスを作成すると直に呼出側に戻って来るが、起動したプログラムの実行結果ではない。 ■その様な事を踏まえてプログラム下記にコーテイングしました(概要) ■「呼び出し側」も「呼び出される」もCD-ROM内に有ります。 ■問題はCreateProcess関数で呼んでから、実際に画像が表示されるまでに、時間が掛かる事です。、 ■「質 問」「やりたい事」 CreateProcess関数で呼んでから、実行画面が表示される時間の間に 「その旨のなんだかのメッセージを表示したい」 例えば、Webでのダウンロードやインストールの時の様な... この様な事を、実現するのはどの様にしますか、宜しくお願いします。 STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si,sizeof(si)); si.cb=sizeof(si); ZeroMemory(&pi,sizeof(pi)); if(CreateProcess(NULL,(LPTSTR)cmdline,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi)){ CloseHandle(pi.hThread); //CD-ROMから直ぐ表示出来ない場合に備えて //この間で表示に時間を要している事をメッセージ出来ないか? ShowWindow(hWnd,SW_MINIMIZE);//タスクトレイに入れる。 WaitForSingleObject(pi.hProcess,INFINITE); CloseHandle(pi.hProcess); ShowWindow(hWnd,SW_RESTORE););//タスクトレイから出す。 }

  • VC++とアプリケーション上の実行の違い

    VC++で作ったプログラムをデバッガ上で起動した場合と、ビルドにより出来た実行ファイルを直接起動した場合とでは、違いがあるのでしょうか? 具体的にはデバッガ上でプログラム中止時にアクセス違反の例外がでていたのですが、動作は正常だったため、試しにアプリケーションから直接起動したところ、処理速度がかなり落ちてしまいました。勿論例外の警告も出ませんでした。 その後デバッガ上で起動しても同様に処理速度が落ちます。 アクセス違反の例外が出ているアプリケーションをVCを通さず実行するとPC自体の設定か何かを壊してしまったりするのでしょうか? ちなみにアプリケーションは動画の制御であり、従来はコミットチャージがPCメモリの容量1.5GBまで終始達していたのですが、処理速度が遅くなってからはVCのメインメモリ使用量255MBまでしか行かなくなりました。映像出力用のメモリかなんかが、割り当ててもらえなくなったりしてるのでしょうか。 ちなみに仮想メモリはキャンセルしています。

  • CGIでCreateProcess

    vc++でCGIアプリケーションを作成しています。 今回、画面よりボタンクリックされたら、 CreateProcessで某exeを起動することになりました。 が、そのexeは処理時間がかかるため、終了を待たないで 画面出力をしたいのです。 単純に CreateProcessがうまくいったら、GetExitCodeProcesで「終わったか」を チェックしないで画面を出力しています。 が、画面出力が全部終わりません。 画面(html)はトップから出力し、iframeがあります。 表示の最後(</html>の前)にiframe内に一覧リストを表示させるよう、 JavaScriptでリクエストを行っています。 ログを見るとトップの出力までは書かれています。 その後、CreateProcessで起動したexeが終了すると、 一覧リストは表示されます。 ログも追加されています。 ##例えばexeが5分かかるとすると5分後にログが最後まで書かれています) ##画面も5分後に一覧リストが表示されます。 何故、一覧リストの処理が待たされているのかわかりません。 ソースはこんな感じです。   ↓ iRet = CreateProcess(0, Pbuff(ここにexe名), 0, 0, TRUE, 0, 0, 0, &startUpInfo, &PInfo ); if ( iRet != TRUE ){ CgiError("xxx", "起動できませんでした", "" ) ; return(-1); }  //この後画面表示処理 何か設定とか、間違ってますでしょうか? または何か他にしなければならないことがあるでしょうか? アドバイスをお願いいたします! 因みに、CreateProcessで起動するexeは最大2時間程度の処理時間になります。 よろしくお願いします。

  • アプリケーション起動時にタスクバーが見えない。

    アプリケーションの起動時にタスクバーが隠れてしまいます。 言語バーもタスクにありますので隠れてしまいます。

  • 子プロセスのデバッグ方法について

    VisualStudio2008のVCでデバッグをしています。 Win32のCreateProcess関数で"自分自身"のEXEファイルを実行すると、新プロセスが起動するのですがデバッグができません。 CreateProcessの呼び出し側プロセスと、同じプログラムである新プロセスを同時にデバッグすることはできないものでしょうか。

  • VC++ のデバッガ起動について

    WindowsXP上でVC++ 6.0 をインストールしている環境で、アプリケーションエラーが起きると勝手にデバッガが起動してしまいます。どうしたら、自動起動をオフにできるのでしょうか。

専門家に質問してみよう