
お世話になっております。
掲題の件でおしえてください。
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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
アプリケーションが終了するま...
-
プロセスIDからウィンドウハ...
-
OSPFでプロセスを分ける意義に...
-
Visual C++からpingを実行して...
-
VB.NET 自プログラムのプロセス...
-
GetModuleFileNameでエラーが出...
-
怪しいプロセス教えてください。
-
popen について
-
AppActivate関数について
-
実行中のプログラムIDが取得...
-
コマンド実行時の結果のリダイ...
-
プロセスIDからプロセスの有無...
-
VBスクリプトでIISのプロ...
-
SQLServerサービスマネージャの...
-
Windowsでのfork方法
-
起動中の他のプログラム(orプ...
-
起動しているプロセスの確認
-
指定した実行中プロセスの、指...
-
プロセスIDの取得(タスクバー...
-
explorer.exeが異様にメモリを食う
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
タスクマネージャーのプロセス...
-
バックグラウンドのプロセスの...
-
プロセスのアタッチ・デタッチ...
-
OSPFでプロセスを分ける意義に...
-
ADOでアクセスのレコードに...
-
非表示になったエクセルは?
-
Process.Startの戻り値を後で取得
-
vb.netでEXCEL起動がうまくでき...
-
C#でのbatファイル実行結果取得
-
プロセスIDの取得方法について
-
Linuxでのスレッド間メッセージ...
-
Visual C++からpingを実行して...
-
SendMessageが失敗するときがある
-
IISがフリーズ
-
スティーブ・ジョブズはプログ...
-
c言語でプロセスIDを調べたい
-
特定ユーザーのプロセス情報を...
-
怪しいプロセス教えてください。
-
セマフォとmutexの違いは?
-
Windowsでのfork方法
おすすめ情報