• ベストアンサー

API関数 GetExitCodeProcess

GetExitCodeProcessで戻り値を取得したいです。 lngRet = GetExitCodeProcess(PROCESS, lngExitCode) とした場合、プロセスが独自に返している戻り値を取得するには どうしたら良いでしょうか? lngExitCodeに終了時の状態が戻るのかと思っていたのですが、 上手く取得できません。

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

  • ベストアンサー
  • todo36
  • ベストアンサー率58% (728/1234)
回答No.6

>Shellで起動した場合でも、 >そのアプリの終了コードを拾うことが出来るのですか? >(GetExitCodeProcessで。) 普通は出来るでしょう。 貴方のソースに問題があると推測しますが (PROCESS_QUERY_INFORMATION権限を気にしていない等)、 提示がなければ答えようがない。

参考URL:
http://vbvbvb.com/jp/gtips/0401/gOpenProcess.html
wan-chan
質問者

お礼

ありがとうございました。 まさに、OpenProcessでの、権限に問題があったようです。 正しく取得できるようになりました。 みなさん、 説明不足で申し訳ありませんでした。 そして、ありがとうございました。

その他の回答 (5)

  • 2ch
  • ベストアンサー率51% (64/125)
回答No.5

終了コードっていか、起動失敗の場合を分けたいっていうことなんじゃない? 起動失敗のステータスを取りたいのであれば、Shell関数でOnErrorでErrハンドリングできるけど、それじゃないの? ShellExecuteでやる方法は、スクリプトと組み合わせる方法しか、思いつかない。 多重起動可能なEXEなら、あらかじめEXEが何個起動しているかを、下記のスクリプトを応用して、全てプロセスハンドルを記憶しておいたらいい。 Option Explicit Private Const DEF_FILE As String = "C:\WINNT\system32\calc.exe" Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long Private Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long Private Declare Function GetExitCodeProcess Lib "kernel32.dll" (ByVal hProcess As Long, lpExitCode As Long) As Long Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long Private Const SW_SHOWNORMAL = 1 Private Const PROCESS_QUERY_INFORMATION = &H400& Private Const STATUS_PENDING = &H103& Private Const STILL_ACTIVE = STATUS_PENDING Private Const OUT_OF_MEMORY_OR_RESOURCES = 0& Private Const ERROR_FILE_NOT_FOUND = 2& Private Const ERROR_PATH_NOT_FOUND = 3& Private Const ERROR_BAD_FORMAT = 11& Private Const SE_ERR_ACCESSDENIED = 5& Private Const SE_ERR_ASSOCINCOMPLETE = 27& Private Const SE_ERR_NOASSOC = 31& Public Sub Main()   Dim lngSts   As Long   Dim strWk    As String   Dim lngProcWnd As Long   lngSts = ShellExecute(ByVal 0&, "open", DEF_FILE, vbNullString, vbNullString, SW_SHOWNORMAL)      Select Case lngSts     Case Is > 32       strWk = "ファイルを開きました。"       lngProcWnd = getPlocWnd(DEF_FILE)       If (lngProcWnd > 0) Then         Call WaitExec(lngProcWnd)       End If            Case OUT_OF_MEMORY_OR_RESOURCES       strWk = "メモリまたはリソースが足りません。"     Case ERROR_FILE_NOT_FOUND       strWk = "ファイルが見つかりません。"     Case ERROR_PATH_NOT_FOUND       strWk = "パスが見つかりません。"     Case ERROR_BAD_FORMAT       strWk = "不正な形式の実行ファイルです。"     Case SE_ERR_ACCESSDENIED       strWk = "アクセスは拒否されました。"     Case SE_ERR_ASSOCINCOMPLETE       strWk = "関連付けが不完全です。"     Case SE_ERR_NOASSOC       strWk = "関連付けが指定されていません。"     Case Else       strWk = "ファイルを開けません。err.Num = " & lngSts   End Select End Sub Private Function getPlocWnd(ByVal inExePath As String) As Long   Dim strSQL As String   Dim objApps As Object   Dim objProc As Object     inExePath = UCase(inExePath)   strSQL = "SELECT * FROM Win32_Process"   Set objApps = VBA.GetObject("winmgmts:").ExecQuery(strSQL)   For Each objProc In objApps     'Exeのパスが一緒の物を探す     If (inExePath = UCase(objProc.ExecutablePath)) Then       Exit For     End If     'End If   Next objProc     '取得できていない   If (objProc Is Nothing) Then     getPlocWnd = -1     Exit Function   End If       '取得したプロセスを終了する   getPlocWnd = objProc.Handle End Function Private Sub WaitExec(inProcWnd As Long)   Dim lngProcessHandle  As Long   Dim lngProcessExitCode As Long      '待機   lngProcessHandle = OpenProcess(PROCESS_QUERY_INFORMATION, 0&, inProcWnd)   Do     Call GetExitCodeProcess(lngProcessHandle, lngProcessExitCode)   Loop While lngProcessExitCode = STILL_ACTIVE   Call CloseHandle(lngProcessHandle)   '終了   MsgBox "終了" End Sub

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.4

>自分でプロセスの終了まで待つ処理はいれてあります。 問題はそっちじゃないんですけど。 関数が異常終了していては取れるわけ無いんですが。 >調べた結果では、 >そのプロセスが終了しているか否かのみしか >判断できないように感じたのですが、 どこからそのような判断を? >指定したプロセスが終了していない場合、終了ステータスとして STILL_ACTIVE が格納されます。 >プロセスが既に終了した場合は、終了ステータスとして次のいずれかが格納されます。 この文章からですか? 終了ステータスというのは >・ExitProcess または TerminateProcess 関数で指定した終了コード。 > >・プロセスの main または WinMain 関数の戻り値。 > >・プロセスを終了させた、まだ処理されていない例外の例外コード。 これらのことを終了コードって言うんですよ。 これがほしいんじゃないんですか?

wan-chan
質問者

お礼

補足します。 終了を待つのは、 WaitForSingleObject を使用しています。 その後に、GetExitCodeProcessで終了コードを 取得しようとしていますが、取得できません。

wan-chan
質問者

補足

>どこからそのような判断を? 他の掲示板などで調べた結果です。 終了状態の判定しか出来ないのではないのですか? Shellで起動した場合でも、 そのアプリの終了コードを拾うことが出来るのですか? (GetExitCodeProcessで。) Shellで起動するアプリでは、 コマンドプロンプトで起動すると、 ERRORLEVELに終了コードを返します。 これと同じものをVBで拾いたいのです。

  • 2ch
  • ベストアンサー率51% (64/125)
回答No.3

原因追求には、情報少なすぎる。 まず、参考URLを見る。 これと比較して、違う部分を言ったほうが、はやい。 っていうか、コードをそのままコピったらでける。

参考URL:
http://oshiete1.goo.ne.jp/kotaeru.php3?q=418086
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

>lngRetには「0」が返ってきます 実行に失敗してますよ。 それくらいは自分でリファレンスを読んで判断してください。 http://www.microsoft.com/japan/developer/library/jpwinpf/_win32_getexitcodeprocess.htm 拡張エラー情報のとり方はわかりますよね? >このプロセスの終了/未終了が拾いたいのではなく、 >このアプリが出しているエラーコードを拾いたいのです。 エラーコードは、当然プロセスが終了した結果ですよね。 このAPIは、プロセスが終了するまで待ちません。 自分でそのプロセスの終了を判断する必要があります。

wan-chan
質問者

補足

勉強不足ですみません。 自分でプロセスの終了まで待つ処理はいれてあります。 その後に、 GetExitCodeProcessを実行しているのですが、 上手くいきません。 そもそも、エラーコードは拾えるのでしょうか? 調べた結果では、 そのプロセスが終了しているか否かのみしか 判断できないように感じたのですが、 どうでしょうか?

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

それでいいんじゃないんですか? ただし、使い方があっていれば。 ちなみにPROCESSには何を入れているのですか? lngRetには何が返ってきているのですか? ただ”上手く取得できません”では、なんか違うんじゃないの?としか誰もいえません。 呼び出しているところだけ書かれても、文法的にあっているかどうかの判断しか誰も出来ませんよ。

wan-chan
質問者

補足

説明が下手で申し訳ありません。 PROCESSには、OpenProcessで取得した値をいれています。 lngRetには「0」が返ってきます。 このプロセスの終了/未終了が拾いたいのではなく、 このアプリが出しているエラーコードを拾いたいのです。 VBでは無理ですか?

関連するQ&A

  • Process.Startの戻り値を後で取得

    お世話になっております。 作業マシン:WINDOWS Server2008 (仮想) 開発ツール:VWD2010(VB) 使用DB:SQLServer2008R2 にて、Webアプリを開発しております。 ASP.NET開発の経験はおおよそ1ヶ月半程です。 現在、Process.Startで外部exeを実行しております。 この外部実行ファイルは3分くらい掛かる処理で、 WaitForExit() で結果を待たずに 次の画面(待機用画面)に遷移しています。 処理が終了したら、待機画面から結果画面へと遷移させたいのですが、 プロセスの完了と、その結果(戻り値)を、 Process.Startをコールした画面以外で受け取る事が出来るのでしょうか。 WaitForExitを使用するならば、 素直に終了を待ち、終了後にExitCodeを取得、 Ret = Process.Start() で戻り値も取得できましたが… WaitForExit( ) をしない場合、どのようにして取得できるのでしょうか。 http://dobon.net/vb/dotnet/process/openfile.html こちら等、Process.Start 非同期 などのキーワードで出てくるのは Processを実行した同画面内での待機のケースが多く、 今自分が遭遇しているケースに応用するには どうにも自分の理解が追いつけず質問いたします。 実行する画面でプロセスIDを取得し、セッションに持たせ、 終了を判断したい画面でプロセスIDを元にチェックをする… と言うことも考えてみましたが、プロセスIDを頼りに、 終了したプロセスの戻り値を突き止める方法も見つからず (発想自体が間違っているかもしれません) 皆様のお力を貸して頂けないでしょうか。何卒よろしくお願いします。

  • VBでのAPI

    いつもお世話になっています。 今回初めて、APIを使うVBのプログラミングをしているんですが、サーバからのファイル名取得でつまずいています。 long型変数 = FtpFindFirstFile(セッション番号, ディレクトリパス, str型変数, 0, 0) って感じで、何かしらファイルが存在するかどうかは戻り値で判定できるのですが、ファイル名自体が取得できません。(複数ファイルが存在するときは、どれか一つのファイル名が取得できれば問題ないです) いろんなサイトを調べたのですが、「引数の文字列変数に"情報"が取得される」ようなふうに書かれており、はっきりしません。ちなみに私の作成中のPGでは、引数の文字列変数は何も格納なれない状態です。 どなたか詳しい方、教えてくれませんか?

  • 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 _ )

  • 時間がかかり過ぎたプロセスをキルする方法

    system関数を用いて、ループ内で外部プログラムを連続的に実行しています。ところが、時々、無限ループに近い状態に陥ってしまうデータがあるので、時間制限を設けて、その時間内に終了しない場合には、そのプロセス(外部プログラム)を強制終了させたいのです。 また、もし、強制終了させた場合には、それと分かるように戻り値を返してもらえると、なお良いです。 この仕組みを実現する手法、もしくは、モジュール等を教えて頂けないでしょうか。

    • ベストアンサー
    • Perl
  • API のString型戻り値について

    現在、VB6.0からVB.NETへ移行中です。 iniファイルから文字列を取得するAPI GetPrivateProfileString?を使用する上でわからない所があります。 GetPrivateProfileString <引数> lpAppName:セクション名 lpKeyName:キー名 lpDefault:キーが見つからなかった場合のデフォルトの文字列 lpReturnedString:取得した文字列が入る nSize:同、文字数 inifilename:INIファイル名 @戻り値@ 取得した文字列 で、VB6.0では、lpReturnedStringにはnSizeで指定したバッファ分戻ってきたのですが、(空文字列で埋めてそのバッファ分を返していた) VB.NETでは、指定したバッファ分ではなく、文字数分のみかえってきてしまいます。しかも、文字列AAAだとすると、"AAA だけで、後ろの " が抜けてしまう状態です。 どうすればいいかご存知の方、教えてください!

  • .NETアプリケーションの戻り値

    .NET(C#)のコンソールアプリケーションを起動し、動作中にタスクマネージャから強制終了したときの戻り値について教えてください。 以下のサイト http://blogs.timberlandchapel.com/blogs/timberlandchapel/archive/2006/06/28/838.aspx には、強制終了時の戻り値は「-1073741510」とありました。 ところが実際にサンプルPGを作ってやってみたところ、戻り値は「1」となります。 PG的には単純にMainの中でSleepの1行だけしか書いておらず、 Sleep中にタスクマネージャからプロセスを終了しています。 サンプルPGの呼出は.batのファイルからです。 (1)事実として「1」が戻ってきているのですが、それが正しいのでしょうか? 正しいとして、何かドキュメントなど情報はありますでしょうか? (2)強制終了時に「-1073741510」を返すようにすることは可能でしょうか? ■環境 Windows Server 2003(x86) / Windows 7(x86) .NET 3.5 SP1

  • JSの高階関数とは?

    高階関数とは? 「関数を引数、戻り値として扱う関数」のことを高階関数と呼びます。 と聞いたのですが、関数が他の関数の引数として、ないしは戻り値とし使われている場合その引数、戻り値の関数のことを高階関数というのでしょうか? するとコールバック関数は引数として関数を使う場合のようですが、半分被りますよね?

  • pidからstatusを得るAPI

    「ps -l」コマンドで出来る事を、 プログラム中から行いたいのですが、 プロセスIDから「S」とか「Z」とかの プロセス状態を得るAPIって 有りますでしょうか? よろしくお願いします。

  • FindWindowの戻り値が違う!?

    いつもお世話になっております。 FindWindowの戻り値についてご教授願います。 ret = FindWindow(NULL,"sample"); 上記を実行した場合、取得する画面がアクティブの時と非アクティブの時でFindWindowの戻り値が違うのは何故でしょうか? 私は、sample画面が非アクティブでもアクティブ状態の時と同じハンドルが取得したのですが、良い方法は有りますでしょうか? 取得画面タイトル:sample 実行ファイル名:sample.exe 実行環境:WindowsXP 開発環境:VC++ 6.0

  • main関数の戻り値について

    c言語において、main関数の戻り値は何を意味しているのですか。 また、void型にすれば、main関数の戻り値を書かなくても問題無いでしょうか。 また、関数はreturn文を書かなくても、最後まで処理を実行すると終了するらしいですが、void型にすれば、main関数でreturn文を書かなくても問題無いでしょうか。