• ベストアンサー

プロセスが実行中かどうか調べる方法

CreateProcessで作ったプロセスが実行中かどうか調べる方法はありませんか。 標準出力に値を吐き出し続けるコンソールアプリケーションから、値を取得して処理をしたいのですが、CreateProcessでつくってパイプで処理しようとしています。ぐぐったところWaitForSingleObjectで待つようなサンプルは見つかったのですが、呼び出したプロセスが終了しないのでこれは使えないので 実行中はずっとループし続けるような感じにしたいのですが。 よろしくお願いします

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

  • ベストアンサー
  • noocyte
  • ベストアンサー率58% (171/291)
回答No.1

> WaitForSingleObjectで待つようなサンプルは見つかったのですが、 > 呼び出したプロセスが終了しないのでこれは使えないので 使えますよ.dwMilliseconds 引数に0を指定すれば待たずにすぐ終了し, 戻り値を調べれば実行中 (WAIT_TIMEOUT) か終了したか (WAIT_OBJECT_0) どうかわかります. WaitForSingleObject http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpdllpro/html/_win32_waitforsingleobject.asp http://yokohama.cool.ne.jp/chokuto/urawaza/api/WaitForSingleObject.html

matico
質問者

お礼

ありがとうございます。 引数0で思ったように動きました。 waitなので必ず待つものだと思っていました。 マニュアルはよく読まないといけないですね。

関連するQ&A

  • CreateProcess関数と実行後の戻り値について

    VB6からCで作られたEXEを実行した戻り値を取得したいのですが どのように記述すればよいのでしょうか? 制御が戻るまで固まらずに待ち続けるには CreateProcessを使うと良いとは思いますが、 notepadなど一方的に動作させて終了するようなサンプルしかなく、 戻り値を取得するサンプルは見当たりませんでした。 戻り値といってもCのEXEは結果を標準出力で表示されるものですが・・・ 何か良いサンプルはあるでしょうか? CreateProcessを使わない方法でも構いません。 r = CreateProcess( _ cmd, _ param, _ ByVal 0&, _ ByVal 0&, _ 0, _ NORMAL_PRIORITY_CLASS, _ ByVal 0&, _ vbNullString, _ si, _ pi _ )

  • VBS 特定のプロセスが終了した後に、別のプロセスを実行したい

    はじめまして。 VBSの初心者です。 VBSで、あるアプリケーションのsetup.exeを実行し、そのsetup.exeのプロセスが終了したあと、特定のメッセージダイアログを出力したいと思いますが、記述方法が分かりません。。。 どなたか、サンプルの記述方法を教えていただけますでしょうか?

  • 子プロセスの実行順序について

    次のコマンドでは、外側のechoの出力内容のコロン(:)の左側で子プロセスによって変数iの値を出力し、その後値をインクリメントしています。右側では親プロセスで同じことを行なっています。 echo "`echo $((i++))`:$((i++))" 子プロセスの内容を先に処理してから親プロセスが残りの内容を実行すると推測し、その場合、コロンの左右で値は右側が大きくなるはずです。 しかし、実際は値は左右変わらず、同じ値が出力されます。 これは子プロセスと親プロセスが並行して処理を行なっているからでしょうか? 右側でインクリメントした値はどこへ行ったのでしょうか? 詳しい方いらっしゃいましたら、解説をお願いします。

  • 別プロセスをの実行パスを取得したいのですが

    自作のアプリケーション実行中に、全く無関係の別のプロセス(つまりprocess.start()等でそのアプリケーションから実行したプロセスではないということです)をDiagnostics.Processクラスのオブジェクトとして取得することはできると思うのですが、取得したプロセスの実行パスを何とかして調べる方法はないものでしょうか?

  • プロセス監視の方法

    どのたかよい方法をご存知の方いらっしゃいましたら、 助力お願いします。 .NETのアプリケーションで、ある特定のプロセスが起動した時に 処理を実行するアプリを作りたいと思っています。 この場合のあるプロセスとは、Notepadとか、Wordとかです。 無限ループで、プロセスを監視しようと思ったのですが、 メモリの消費が多く重たいので、何かよい方法はないでしょうか? 例えば、ある特定のプロセスが起動したら、 それがトリガーとなるような仕組みとか、可能でしょうか? よろしくお願いします。

  • CreateProcessでwordのプロセスが複数出来ない

    開発環境:VC++2008 / Windows XP / Office2007 指定したOfficeファイルを、プログラムからアプリを指定して開き、 そのファイルが閉じられたら、次の処理を行うというプログラムを 作成中なのですが、 FindExecutableでアプリを検索し、 CreateProcessでアプリを起動。 WaitForSingleObjectで閉じられるまで待機し、 閉じられたら、次処理へ。という流れを マルチスレッドで行っています。 1つ目のwordファイル(a.doc)を開き、 2つ目のwordファイル(b.doc)を開くと、b.docの方は、 WaitForSingleObjectで待機せず、そのまま 次処理へ移行してしまいます。 CreateProcessの戻り値は正常で、b.docファイルも起動するのですが、 プロセス自体は、タスクマネージャで見る限り、1つしかありません。 word.exeが単一プロセスで複数ファイルをコントロールしていると思うのですが、 別プロセスで複数のwordを立ち上げる事は可能なのでしょうか?

  • 【C++】セマフォとプロセスの使い方

    【C++】セマフォとプロセスの使い方 WindowsXPでVC++2008コンパイラを使用して、 プロセスとセマフォについて勉強しています。 外部プログラム(今回は電卓として)を5つ立ち上げるのですが、 同時に立ち上げるのは2つまでとしたい場合、どのように組むのでしょうか。 http://nienie.com/~masapico/api_CreateSemaphore.html こちらにスレッドを使用したセマフォを使ったサンプルがあるのでが、 プロセスを使うとなると、うまく書けません。 ご指導頂けませんでしょうか。 ===現在まで書いたソース=== (5つのプロセスをつくるループも実装していませんが、、、) #include<windows.h> #include<stdio.h> #include<tchar.h> HANDLE g_hSemaphre; void main(){ BOOL bRet; STARTUPINFO si; PROCESS_INFORMATION pi; //Semaphoreオブジェクト g_hSemaphre = CreateSemaphore(NULL,2,2,NULL); bRet = CreateProcess(_T("C:\\WINDOWS\\system32\\calc.exe"), _T(""), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); //プロセス終了 WaitForSingleObject(pi.hProcess,INFINITE); //後処理(プロセス開放) ReleaseSemaphore(g_hSemaphre,1,NULL); //スレッドとプロセスを閉じる。 CloseHandle(pi.hThread); CloseHandle(pi.hProcess); //Semaphoreオブジェクト CloseHandle(g_hSemaphre); }

  • fork()で作られた子プロセスから親プロセスの生存を知る方法は?

    タイトルの通りなのですが、プロセスAから fork()で子プロセスBを作り、Bには無限ループで処理をさせます。 Aはユーザからの入力を受け、処理を行います。 Aが終了要求をされプロセスを終了するときに、 Bも同時に終了したいのですが、BからAの生存を判定して Aのプロセスが切れていたBも終了する、ということは可能でしょうか? Bの無限ループ処理では、ファイルの書き換えを行っているので AからBのPIDを指定してKillする、ということはせずに B自身で判定して終了するようにしたいのですが。。

  • エクスプローラから開かれるWordを別プロセスにするには

    VC++2008にてプログラムを作成しています。 自作プログラム(疑似エクスプローラ)にて、 WordやExcelファイルをCreateProcessにて オープンし、WaitForSingleObjectにて ファイルが閉じられるまで待機。 ファイルが閉じられたら、終了処理という流れのシステムを 作成しています。 自作プログラムからオープンする際は、 Officeのコマンドラインオプションを用いて 別プロセスで起動するようにしていますので、 自作プログラムからWord(またはExcel)ファイルを 複数開いても、個別プロセスになるので、 各ファイルが個別に終了処理を行えるようになっています。 (なっていると思っていた) 問題は、自作プログラムからWord(a.doc)を開き、 エクスプローラから別ファイルのWord(b.doc)を開いた際、 b.docは個別にプロセスが作成されず、 a.docで作成した1プロセスにまとめられてしまうことです。 そのため、a.docを閉じても、b.docが開いている限り、 終了処理に移行しません。 APIフックにて、CreateProcessを引っ掛けてみたのですが、 エクスプローラからのファイルオープン時には 呼ばれていないようで、自作プログラム外で ファイルオープンをした際に、強制的に独自プロセスで 起動する方法が分りません。 自作プログラム起動時に限り、Word,Excelのファイルを 独自プロセスで開かせたいのですが、 解決方法はありますでしょうか? よろしくお願いします。

  • VB.NETでCreateProcess

    VB.NET(2003)で、別exeを起動し、終了まで待機するということをするために、 system.Diagnostics.Processクラスを使用していました。 しかし、実際に動かす環境がMetaFrameなのですが、 その環境では、このクラスは使用できないようで画面の起動すらできなくなります。 ですので、別の方法ということで、APIのCreateProcess、WaitForSingleObjectを使用するように変更したいのですが、 VB.NETでのサンプルが余り無いため、パラメータにどのように設定するかなどがよくわかりません。 API自体使ったことが無いので、根本的にわから無すぎるのです・・・ VB.NETでAPI利用サンプルが多く掲載されているサイト、 できれば、CreateProcess、WaitForSingleObjectを使用しているサンプルなどありましたら、ご教授願います。 よろしくお願いいたします。

専門家に質問してみよう