dポイントプレゼントキャンペーン実施中!

GetExitCodeProcessで戻り値を取得したいです。

lngRet = GetExitCodeProcess(PROCESS, lngExitCode)

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

A 回答 (6件)

>Shellで起動した場合でも、


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

参考URL:http://vbvbvb.com/jp/gtips/0401/gOpenProcess.html
    • good
    • 0
この回答へのお礼

ありがとうございました。
まさに、OpenProcessでの、権限に問題があったようです。
正しく取得できるようになりました。

みなさん、
説明不足で申し訳ありませんでした。
そして、ありがとうございました。

お礼日時:2003/06/03 18:13

終了コードっていか、起動失敗の場合を分けたいっていうことなんじゃない?



起動失敗のステータスを取りたいのであれば、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
    • good
    • 0

>自分でプロセスの終了まで待つ処理はいれてあります。



問題はそっちじゃないんですけど。
関数が異常終了していては取れるわけ無いんですが。


>調べた結果では、
>そのプロセスが終了しているか否かのみしか
>判断できないように感じたのですが、


どこからそのような判断を?

>指定したプロセスが終了していない場合、終了ステータスとして STILL_ACTIVE が格納されます。
>プロセスが既に終了した場合は、終了ステータスとして次のいずれかが格納されます。

この文章からですか?

終了ステータスというのは
>・ExitProcess または TerminateProcess 関数で指定した終了コード。
>
>・プロセスの main または WinMain 関数の戻り値。
>
>・プロセスを終了させた、まだ処理されていない例外の例外コード。

これらのことを終了コードって言うんですよ。
これがほしいんじゃないんですか?

この回答への補足

>どこからそのような判断を?

他の掲示板などで調べた結果です。
終了状態の判定しか出来ないのではないのですか?
Shellで起動した場合でも、
そのアプリの終了コードを拾うことが出来るのですか?
(GetExitCodeProcessで。)

Shellで起動するアプリでは、
コマンドプロンプトで起動すると、
ERRORLEVELに終了コードを返します。
これと同じものをVBで拾いたいのです。

補足日時:2003/06/03 14:03
    • good
    • 0
この回答へのお礼

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

お礼日時:2003/06/03 14:10

原因追求には、情報少なすぎる。




まず、参考URLを見る。

これと比較して、違う部分を言ったほうが、はやい。

っていうか、コードをそのままコピったらでける。

参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=418086
    • good
    • 0

>lngRetには「0」が返ってきます



実行に失敗してますよ。
それくらいは自分でリファレンスを読んで判断してください。
http://www.microsoft.com/japan/developer/library …
拡張エラー情報のとり方はわかりますよね?


>このプロセスの終了/未終了が拾いたいのではなく、
>このアプリが出しているエラーコードを拾いたいのです。

エラーコードは、当然プロセスが終了した結果ですよね。
このAPIは、プロセスが終了するまで待ちません。
自分でそのプロセスの終了を判断する必要があります。

この回答への補足

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

補足日時:2003/06/03 13:07
    • good
    • 0

それでいいんじゃないんですか?



ただし、使い方があっていれば。

ちなみにPROCESSには何を入れているのですか?
lngRetには何が返ってきているのですか?

ただ”上手く取得できません”では、なんか違うんじゃないの?としか誰もいえません。

呼び出しているところだけ書かれても、文法的にあっているかどうかの判断しか誰も出来ませんよ。

この回答への補足

説明が下手で申し訳ありません。

PROCESSには、OpenProcessで取得した値をいれています。
lngRetには「0」が返ってきます。

このプロセスの終了/未終了が拾いたいのではなく、
このアプリが出しているエラーコードを拾いたいのです。
VBでは無理ですか?

補足日時:2003/06/03 08:41
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています