![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
No.3ベストアンサー
- 回答日時:
こんにちは。
maruru01です。別のAPIによる方法です。
WaitShellという関数を自作しました。
関数の引数には、Shell関数の引数をそのまま渡せばOKです。
***** API関数と定数の宣言 *****
'既存のプロセスオブジェクトのハンドルを返す関数
Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
'OpenProcess関数の第1引数用の定数
Public Const PROCESS_QUERY_INFORMATION = &H400&
'指定されたプロセスの終了状態を返す関数
Public Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
'終了コードを示す定数
Public Const STATUS_PENDING = &H103&
Public Const STILL_ACTIVE = STATUS_PENDING
'オープンしているオブジェクトハンドルをクローズする関数
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
***** 関数 *****
'アプリケーションを起動し、終了するまで待機する
Public Sub WaitShell(AppPath As String, Optional SizeFocusmode As Integer = vbNormalFocus)
Dim AppID As Long 'Shell関数の戻り値
Dim Process As Long 'OpenProcess関数の戻り値
Dim ExitCode As Long '終了コード
Dim rc As Long
AppID = Shell(AppPath, SizeFocusmode)
Process = OpenProcess(PROCESS_QUERY_INFORMATION, 1, AppID)
'プロセスが終了していない間はDoEvents関数でOSに制御を戻す
Do
rc = GetExitCodeProcess(Process, ExitCode)
DoEvents
Loop While ExitCode = STILL_ACTIVE
rc = CloseHandle(Process)
End Sub
No.4
- 回答日時:
例えば下記で出来ます。
RETVAL = Shell(CTL_Edit_PATH, 1)
RETVAL2 = 0
Do While RETVAL2 = 0 '起動待ち
RETVAL2 = OpenProcess(&H400, Not 0, RETVAL)
DoEvents
Loop
lpExitCode = &H103
Do While lpExitCode = &H103 '終了待ち
RETVAL3 = GetExitCodeProcess(RETVAL2,lpExitCode)
DoEvents
Loop
No.2
- 回答日時:
#1の方に補足です。
API ビューアだと
INFINITE が &HFFFFになっていますが
実際は INFINITE=&HFFFFFFFF
かと思います。
&HFFFFだと65秒でタイムアウトしませんか?
(実際確かめてないので自信はありません。間違ってたらごめんなさい。)
No.1
- 回答日時:
私が以前作成したEXEの同期起動プロシージャを提示します。
参考にして下さい(というよりそのまま使えると思います)。
下記のようにAPIを定義して
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
下記のプロシージャを定義して下さい。
Public Function pfncWaitApp(strExeName As String, Optional vntOpt As Variant) As Boolean
Dim lngResultCode As Long
Dim lngIdProcess As Long
Dim lngHdlProcess As Long
Dim intOpt As Integer
Const SYNCHRONIZE = &H100000
Const INFINITE = &HFFFF
If IsMissing(vntOpt) Then
intOpt = vbNormalFocus
Else
intOpt = vntOpt
End If
'EXE起動
On Error Resume Next
lngIdProcess = Shell(strExeName, intOpt)
DoEvents
Select Case Err
Case 53 'Not Found
MsgBox "指定されたプログラムが存在しません" & _
vbCr & "プログラム名 = " & strExeName, vbCritical
pfncWaitApp = False
Case 0 '正常
'同期をとる
lngHdlProcess = OpenProcess(SYNCHRONIZE, 0&, lngIdProcess)
lngResultCode = WaitForSingleObject(lngHdlProcess, INFINITE)
lngResultCode = CloseHandle(lngHdlProcess)
pfncWaitApp = True
Case Else 'エラー
MsgBox Error, vbCritical
pfncWaitApp = False
End Select
End Function
下記のように呼び出してください。
Call pfncWaitApp("hoge.exe")
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) Windows上のプログラム。「予め決められた時刻に自分で起動して処理して自分で終了する」って可能? 3 2023/01/04 14:29
- システム CPUの問題について 2 2022/07/09 12:04
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- デスクトップパソコン 「自動修復でPCを修復できませんでした」と表示されPCが起動しないのですが対処法はありますか? 5 2022/05/13 09:16
- IT・エンジニアリング 不具合の現状認識をしないプログラマって信用できる人? できない人? 8 2023/07/28 09:09
- Windows 10 バッチファイルでのエクスプローラー終了 1 2022/05/30 14:32
- JavaScript 変数のスコープの問題? 3 2022/06/23 09:32
- Visual Basic(VBA) vbaエクセルマクロ RemoveDuplicatesについて 重複したものがあれば行を削除するとい 1 2023/02/27 18:49
- Visual Basic(VBA) ファイル全てを .xlsm に変更したところ、プログラムが途中で落ちてしまっています 17 2022/12/07 12:03
- ノートパソコン .dllファイルがありませんと表示される 5 2023/04/30 03:03
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
64bitで作ったEXEを32bitで起動...
-
ウィンドウを終了させたい・・・
-
CreateProcessのエラー
-
ACCESS VBAで別のACCESS(mdb)を...
-
WinSCPで画像のように puttyを...
-
Windows上のプログラム。「予め...
-
Vba アプリケーションが立ち上...
-
Process.Startで起動したアプリ...
-
VBSで起動したアプリが前面表示...
-
VBAでSeleniumからChromeを起動...
-
ASPからVB実行
-
MSペイントを画像ファイル名を...
-
アウトルックが起動しているか...
-
VBAでOutlookを終了させたい Ex...
-
vba 時間の引き算 例えば 15:00...
-
Designer.vbは直接コードをいじ...
-
C#ソースをCSCファイルにてコン...
-
Visual Studio 「AnyCpu」について
-
ManagementClassが見つからない。
-
VB2008→VB2010でエラーが出てま...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
アウトルックが起動しているか...
-
VBAでOutlookを終了させたい Ex...
-
VBで実行中のEXEファイルの情報...
-
Process.Startで起動したアプリ...
-
Windows上のプログラム。「予め...
-
VBSから別のVBS起動するとき変...
-
EXCEL VBAから他アプリケーショ...
-
VBSで起動したアプリが前面表示...
-
分かる人は簡単なのだろうが、v...
-
別アプリの起動、終了について
-
VBAでSeleniumからChromeを起動...
-
VB6で呼び出し元の情報を取得す...
-
ACCESS VBAで別のACCESS(mdb)を...
-
フォームの最前面が効かない
-
exeファイルを実行するとすぐに...
-
実行ファイルへのドラッグ&ド...
-
「FindWindow」、ウィンドウハ...
-
MSDOS(バッチファイル)でプロセ...
-
C# 他のアプリケーションを優先...
-
QueryPerformanceCounter の使...
おすすめ情報