
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も見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
第三者に画面を同期するソフト...
-
バックグラウンドのプロセスの...
-
プロセスのアタッチ・デタッチ...
-
起動中の他のプログラム(orプ...
-
GetModuleFileNameでエラーが出...
-
怪しいプロセス教えてください。
-
【C#】別プロセスがロックか...
-
AppActivate関数について
-
Process.Startの戻り値を後で取得
-
popen について
-
SendMessageが失敗するときがある
-
警告『 別のプロセスで使用され...
-
VC++6.0 「プロセスへ...
-
Active Basic 他のアプリケー...
-
プロセスが実行中かどうか調べ...
-
プロセス監視の方法
-
ソニーやキオクシア、マイクロ...
-
非表示になったエクセルは?
-
他のアプリケーションをクリッ...
-
Linuxでのスレッド間メッセージ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
プロセスIDの取得方法について
-
ADOでアクセスのレコードに...
-
C#でのbatファイル実行結果取得
-
タスクマネージャーのプロセス...
-
VB6.0 SHELLで起動...
-
プロセスのアタッチ・デタッチ...
-
怪しいプロセス教えてください。
-
非表示になったエクセルは?
-
【C#】別プロセスがロックか...
-
sleep関数の精度について
-
Process.Startの戻り値を後で取得
-
IISがフリーズ
-
Linuxでのスレッド間メッセージ...
-
プロセスIDからウィンドウハ...
-
Windowsでのfork方法
-
SendMessageが失敗するときがある
-
警告『 別のプロセスで使用され...
-
WSH.Runで待機できません
-
VB.NETで起動したExcelの閉じ方...
おすすめ情報