![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
No.6ベストアンサー
- 回答日時:
>Shellで起動した場合でも、
>そのアプリの終了コードを拾うことが出来るのですか?
>(GetExitCodeProcessで。)
普通は出来るでしょう。
貴方のソースに問題があると推測しますが
(PROCESS_QUERY_INFORMATION権限を気にしていない等)、
提示がなければ答えようがない。
参考URL:http://vbvbvb.com/jp/gtips/0401/gOpenProcess.html
ありがとうございました。
まさに、OpenProcessでの、権限に問題があったようです。
正しく取得できるようになりました。
みなさん、
説明不足で申し訳ありませんでした。
そして、ありがとうございました。
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
No.4
- 回答日時:
>自分でプロセスの終了まで待つ処理はいれてあります。
問題はそっちじゃないんですけど。
関数が異常終了していては取れるわけ無いんですが。
>調べた結果では、
>そのプロセスが終了しているか否かのみしか
>判断できないように感じたのですが、
どこからそのような判断を?
>指定したプロセスが終了していない場合、終了ステータスとして STILL_ACTIVE が格納されます。
>プロセスが既に終了した場合は、終了ステータスとして次のいずれかが格納されます。
この文章からですか?
終了ステータスというのは
>・ExitProcess または TerminateProcess 関数で指定した終了コード。
>
>・プロセスの main または WinMain 関数の戻り値。
>
>・プロセスを終了させた、まだ処理されていない例外の例外コード。
これらのことを終了コードって言うんですよ。
これがほしいんじゃないんですか?
この回答への補足
>どこからそのような判断を?
他の掲示板などで調べた結果です。
終了状態の判定しか出来ないのではないのですか?
Shellで起動した場合でも、
そのアプリの終了コードを拾うことが出来るのですか?
(GetExitCodeProcessで。)
Shellで起動するアプリでは、
コマンドプロンプトで起動すると、
ERRORLEVELに終了コードを返します。
これと同じものをVBで拾いたいのです。
補足します。
終了を待つのは、
WaitForSingleObject
を使用しています。
その後に、GetExitCodeProcessで終了コードを
取得しようとしていますが、取得できません。
No.3
- 回答日時:
原因追求には、情報少なすぎる。
まず、参考URLを見る。
これと比較して、違う部分を言ったほうが、はやい。
っていうか、コードをそのままコピったらでける。
参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=418086
No.2
- 回答日時:
>lngRetには「0」が返ってきます
実行に失敗してますよ。
それくらいは自分でリファレンスを読んで判断してください。
http://www.microsoft.com/japan/developer/library …
拡張エラー情報のとり方はわかりますよね?
>このプロセスの終了/未終了が拾いたいのではなく、
>このアプリが出しているエラーコードを拾いたいのです。
エラーコードは、当然プロセスが終了した結果ですよね。
このAPIは、プロセスが終了するまで待ちません。
自分でそのプロセスの終了を判断する必要があります。
この回答への補足
勉強不足ですみません。
自分でプロセスの終了まで待つ処理はいれてあります。
その後に、
GetExitCodeProcessを実行しているのですが、
上手くいきません。
そもそも、エラーコードは拾えるのでしょうか?
調べた結果では、
そのプロセスが終了しているか否かのみしか
判断できないように感じたのですが、
どうでしょうか?
No.1
- 回答日時:
それでいいんじゃないんですか?
ただし、使い方があっていれば。
ちなみにPROCESSには何を入れているのですか?
lngRetには何が返ってきているのですか?
ただ”上手く取得できません”では、なんか違うんじゃないの?としか誰もいえません。
呼び出しているところだけ書かれても、文法的にあっているかどうかの判断しか誰も出来ませんよ。
この回答への補足
説明が下手で申し訳ありません。
PROCESSには、OpenProcessで取得した値をいれています。
lngRetには「0」が返ってきます。
このプロセスの終了/未終了が拾いたいのではなく、
このアプリが出しているエラーコードを拾いたいのです。
VBでは無理ですか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript カラーミーショップのsectionループ内で、[引数][戻り値]ありの関数的な処理を行いたいです。 1 2022/05/07 19:39
- 心理学 無謀な目標を立てた、本当の理由 2 2022/08/27 11:37
- 数学 確率の問題 4 2023/02/24 01:07
- 日本語 箱の中に,1 と書かれたカードが 3 枚,2 と書かれたカードが 2 枚,0 と書かれた カ 4 2022/03/31 13:46
- Excel(エクセル) 行の一番右のデータセルと同じ列の日付を取得する方法 2 2022/09/22 20:05
- Excel(エクセル) Excelマクロの表示のExcel内をfindで検索 3 2022/06/15 20:07
- Visual Basic(VBA) 貼り付けた値が消えていく 以下はソースファイルの2番目のシートのB6から最終行を取得 ターゲットファ 2 2023/07/27 12:23
- Excel(エクセル) Excelのマクロで、特定のセルから順番に値を取得したい 5 2022/12/06 15:34
- Visual Basic(VBA) VBA GetAttrについて教えてください 2 2022/12/22 15:25
- FX・外国為替取引 ドル/円と元/円を両建てのように運用していくやり方はうまくいくでしょうか? 2 2022/08/01 11:03
このQ&Aを見た人はこんなQ&Aも見ています
-
「どうして捨てられないの?」前妻の物を捨てられない男性の心理って?
前妻の物を捨てられない理由に加え、捨てるための手段はあるのかを専門家に聞いてみた!
-
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
CreateProcess関数と実行後の戻り値について
Visual Basic(VBA)
-
外部exe呼び出しの方法 ShellExecuteEx, System...
C言語・C++・C#
-
-
4
コマンドプロンプトの「%1」と「%~1」の違いがわからない
その他(プログラミング・Web制作)
-
5
アクセス2000の終了時にバックアップするマクロ
その他(データベース)
-
6
画面を強制的に再描画させる方法
C言語・C++・C#
-
7
DWORDとcharの変換
C言語・C++・C#
-
8
VBAで既に開いている別アプリケーションのオブジェクトを得る
Visual Basic(VBA)
-
9
VBアプリケーションで終了コードを指定する方法
Visual Basic(VBA)
-
10
ExitProcessの関数コールについて教えてください。
C言語・C++・C#
-
11
VC++から引数付きexeファイルの実行
C言語・C++・C#
-
12
Visual Studio 「AnyCpu」について
C言語・C++・C#
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
explorer.exeが異様にメモリを食う
-
タスクマネージャーのプロセス...
-
C++のプログラムをバックグラウ...
-
プロセスのアタッチ・デタッチ...
-
CreateObjectで作成したExcelの...
-
ウインドウのプロセス終了について
-
VB6.0 SHELLで起動...
-
ADOでアクセスのレコードに...
-
Visual C++からpingを実行して...
-
C#でのbatファイル実行結果取得
-
ShellExecuteが起動したプロセ...
-
非表示になったエクセルは?
-
子プロセスの状態を親プロセス...
-
popen について
-
ロードアベレージが高いのです...
-
誤ってプロセスの終了をしてし...
-
特定ユーザーのプロセス情報を...
-
親子プロセス間でのデータの受...
-
vb.netでEXCEL起動がうまくでき...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
explorer.exeが異様にメモリを食う
-
タスクマネージャーのプロセス...
-
VB6.0 SHELLで起動...
-
C#でのbatファイル実行結果取得
-
プロセスのアタッチ・デタッチ...
-
プロセスIDからウィンドウハ...
-
プロセスIDの取得方法について
-
popen について
-
C++のプログラムをバックグラウ...
-
非表示になったエクセルは?
-
Windowsでのfork方法
-
別のプロセスの関数を呼び出す...
-
sleep関数の精度について
-
Visual C++からpingを実行して...
-
ADOでアクセスのレコードに...
-
C++でシェルを起動
-
SendMessageが失敗するときがある
-
ウィンドウのタイトルからプロ...
-
OSPFでプロセスを分ける意義に...
おすすめ情報