
お世話になっております。
掲題の件でおしえてください。
Set objWshShell = CreateObject("WScript.Shell")
ret = objWshShell.Run("abc.exe", 0, true)
上記のようなコードで、同期をとって外部プログラム(abc.exe)を実行させています。
abc.exeの中では別の外部プログラム(Setup.exe:InstallShieldで作成)を
同様にWSHで同期を取って実行させています。
上記コードををループを使って実行したところ、
Setup.exe実行中にabc.exeの処理が終了してしまうようで、意図した動作となりません。
どのようにしたら、Setup.exe終了を待機して、abc.exeを終了させられるのでしょうか?
よろしくお願いいたします。
Win7;VB6
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
VB6でやっているならCreateProcessという
APIで起動制御する方法が確実です。
このAPIはプロセスを起動し、スレッドと、
プロセスのハンドルを返します。
WairForSingleObjectというAPIでプロセス
ハンドルを待機すれば、プロセス終了まで
停止した状態になります。
Type STARTUPINFO
cb As Long
lpReserved As String
lpDesktop As String
lpTitle As String
dwX As Long
dwY As Long
dwXSize As Long
dwYSize As Long
dwXCountChars As Long
dwYCountChars As Long
dwFillAttribute As Long
dwFlags As Long
wShowWindow As Integer
cbReserved2 As Integer
lpReserved2 As Long
hStdInput As Long
hStdOutput As Long
hStdError As Long
End Type
Type PROCESS_INFORMATION
hProcess As Long
hThread As Long
dwProcessId As Long
dwThreadId As Long
End Type
Declare Function CreateProcessA Lib "kernel32" _
(ByVal アプリ As Long, _
ByVal コマンド As String, _
ByVal プロセス継承 As Long, _
ByVal スレッド継承 As Long, _
ByVal 継承有無 As Long, _
ByVal フラグ As Long, _
ByVal 環境変数 As Long, _
ByVal カレント As Long, _
開始情報 As STARTUPINFO, _
プロセス情報 As PROCESS_INFORMATION) As Long
Declare Function WaitForSingleObject Lib "kernel32" _
(ByVal ハンドル As Long, _
ByVal ミリ秒 As Long) As Long
Declare Function CloseHandle Lib "kernel32" _
(ByVal ハンドル As Long) As Long
プログラムはこんな感じ
Dim 開始情報 As STRATUPINFO
Dim プロセス As PROCESS_INFORMATION
開始情報.cb = Len(開始情報)
'★必ず成功すると思って戻り値は調べない
CreateProcessA 0, "Setup.exe ~", 0, 0, 0, &H20, 0, 0, _
開始情報,プロセス
'★スレッドは不要なので直ぐ閉じる
CloseHandle プロセス.hThread
'★終わるまで待機する(-1は無期限待機の意味)
WaitForSingleObject プロセス.hProcess, -1
'★終了後は閉じる
CloseHandle プロセス.hProcess
この方法はあらゆるアプリに対して使用できる。
というか、Windowsの基本アーキテクチャだから。
STARTUPINFOを使いこなすと、面白いこともできる。
CreateProcessの本当の定義ではアプリやカレントは
文字列だし、スレッド継承やプロセス継承はセキュリティ
記述子へのポインタなのだが、どうせNULLを指定する
からLong型で定義している。&H20は通常プライオリティを
意味する値で長い定義名があるのだが、面倒なので
直定数にしました。興味があったら調べてください。
http://msdn.microsoft.com/ja-jp/library/cc429066 …
早速のレスをありがとうございました。
御礼が遅くなりまして申し訳ありません。
結論から申し上げますと、
動作しない理由はその端末の環境不備にありました。
プログラムは正常に動作していました。
提示してくださった方法は知りませんでしたので、
次の機会に是非試してみたいと思います。
サンプルコード、リンク先の提示と、興味深く拝見しました。
丁寧にご回答いただき、ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- オープンソース Pythonのコードをexe化 1 2023/07/03 08:01
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- その他(ソフトウェア) A列車でいこう9が起動できません 2 2022/06/15 16:33
- その他(Microsoft Office) VBA メール送信済で実行されるはずが、実行されない時があります。 2 2023/02/02 14:05
- Windows 10 Windows11の実行モジュールはどこにある 1 2022/05/31 07:33
- Windows 10 windows11のUSB接続の機器がcomポートに表示されない。 3 2023/04/13 07:51
- その他(IT・Webサービス) エクセルの実行ファイルについての質問です。 1 2023/05/04 03:58
- 労働相談 合意済み仕様の商品納入後における仕様変更要求への対応について 5 2023/04/19 09:41
- Excel(エクセル) Excel2010 VBAが特定動作で実行出来なくなる 7 2022/12/29 14:26
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
VB6.0 SHELLで起動...
-
SendMessageが失敗するときがある
-
他のEXEが起動しているかの確認
-
Windowsでのfork方法
-
プロセスのアタッチ・デタッチ...
-
sleep関数の精度について
-
プロセスIDからウィンドウハ...
-
プロセスIDの取得方法について
-
デッドロックでダウンします。...
-
怪しいプロセス教えてください。
-
Visual C++からpingを実行して...
-
CGIからCGIを、CGI環境変数付き...
-
VC++6.0 「プロセスへ...
-
フレームワークとプロセスの違...
-
プロセスが実行中かどうか調べ...
-
コンピュータのCPU使用率が常に...
-
iPodの取り外しの際のエラーメ...
-
C言語のプログラムにて二つの処...
-
他のアプリケーションをクリッ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
VB6.0 SHELLで起動...
-
プロセスIDの取得方法について
-
C#でのbatファイル実行結果取得
-
タスクマネージャーのプロセス...
-
プロセスのアタッチ・デタッチ...
-
vb.netでEXCEL起動がうまくでき...
-
SendMessageが失敗するときがある
-
ADOでアクセスのレコードに...
-
非表示になったエクセルは?
-
explorer.exeが異様にメモリを食う
-
怪しいプロセス教えてください。
-
Process.Startの戻り値を後で取得
-
プロセスIDからウィンドウハ...
-
Linuxでのスレッド間メッセージ...
-
警告『 別のプロセスで使用され...
-
Visual C++からpingを実行して...
-
WSH.Runで待機できません
-
c言語でプロセスIDを調べたい
-
API関数 GetExitCodeProcess
おすすめ情報