
お世話になっております。
掲題の件でおしえてください。
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を探す
今、見られている記事はコレ!
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
-
大麻の使用罪がなかった理由や法改正での変更点、他国との違いを弁護士が解説
ドイツで2024年4月に大麻が合法化され、その2ヶ月後にサッカーEURO2024が行われた。その際、ドイツ警察は大会運営における治安維持の一つの方針として「アルコールを飲んでいるグループと、大麻を吸っているグループ...
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プロセスのアタッチ・デタッチ...
-
vb.netでEXCEL起動がうまくでき...
-
プロセスIDの取得方法について
-
OSPFでプロセスを分ける意義に...
-
Windowsでのfork方法
-
C#でのbatファイル実行結果取得
-
iPodの取り外しの際のエラーメ...
-
explorer.exeが異様にメモリを食う
-
GetModuleFileNameでエラーが出...
-
セマフォとmutexの違いは?
-
タスクマネージャーのプロセス...
-
IISがフリーズ
-
C++のプログラムをバックグラウ...
-
windowsのプロセスIDやスレッド...
-
C++でシェルを起動
-
非表示になったエクセルは?
-
親子プロセス間でのデータの受...
-
怪しいプロセス教えてください。
-
Windowsで環境変数を設定できま...
-
C言語のプログラムにて二つの処...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
プロセスIDの取得方法について
-
ADOでアクセスのレコードに...
-
C#でのbatファイル実行結果取得
-
タスクマネージャーのプロセス...
-
VB6.0 SHELLで起動...
-
プロセスのアタッチ・デタッチ...
-
非表示になったエクセルは?
-
怪しいプロセス教えてください。
-
sleep関数の精度について
-
【C#】別プロセスがロックか...
-
Process.Startの戻り値を後で取得
-
IISがフリーズ
-
プロセスIDからウィンドウハ...
-
Linuxでのスレッド間メッセージ...
-
Windowsでのfork方法
-
SendMessageが失敗するときがある
-
警告『 別のプロセスで使用され...
-
WSH.Runで待機できません
-
VB.NETで起動したExcelの閉じ方...
おすすめ情報