- ベストアンサー
VBで別のプログラムを起動し他の処理を中断したい
VBプログラムの実行中に、shell("hoge.exe")で別のプログラムを起動しそのプログラムが終了すれば次の処理に移るという処理をしたいんですが、実現方法がわかりません。どうすればよいでしょうか?アドバイスよろしくお願いします。
- gangangan
- お礼率0% (0/10)
- Visual Basic
- 回答数4
- ありがとう数2
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。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
その他の回答 (3)
- jincyan
- ベストアンサー率36% (4/11)
例えば下記で出来ます。 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
- sha-girl
- ベストアンサー率52% (430/816)
#1の方に補足です。 API ビューアだと INFINITE が &HFFFFになっていますが 実際は INFINITE=&HFFFFFFFF かと思います。 &HFFFFだと65秒でタイムアウトしませんか? (実際確かめてないので自信はありません。間違ってたらごめんなさい。)
- mfuku
- ベストアンサー率50% (173/345)
私が以前作成した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
- 【VB2005】別のプログラムから別のプログラム起動
"A"というVB2005で、作成したプログラムがありまして、 メインのフォームがあり、 そこにボタンがあります。 Shellの関数を使って、クリックイベントで、 指定したExe"B"を立ち上げます。 そのExe"B"は、VB2005で作成したオリジナルのプログラムです。 プロジェクトは別で作った物と考えてください。 Exe"B"を起動した画面を[フォーム1]と考えて、 ボタンがあり、クリックすると 別の[フォーム2]が表示するはずなのですが、 特にエラーも掴まずに、Showで開くことができません。 しかし、Exe"B"からダイレクトに起動させて ボタンをクリックしたら[フォーム2]が表示されます。 どうしたら、Exe"A"からExe"B"を起動して Exe"B"からフォーム2を呼び出すことができるか、 考えられる要因などをアドヴァイスして頂けたら助かります。
- 締切済み
- Visual Basic
- VBプログラムの終了
VB6.0で作成した実行ファイル(exe)を終了させても タスクマネージャのプロセスに残ってしまい、 もう一度プログラムを起動することができません。 (プログラムで二重起動防止の処理をしています) このプログラムをVBのラインタイムが入っていない マシンで動かしているのですが、 やはりそれが問題なのでしょうか? それとも別に何か原因があるのでしょうか?
- ベストアンサー
- Visual Basic
- vb プログラムの起動と例外処理
はじめまして プログラムの実行と例外処理に関して質問させていただきます。 現在,visual basic2005でプログラム(A)からvbで作成した別のプログラム(B)に引数を指定してから起動し,別のプログラム(B)が例外処理に関する方法を調べています。 プログラム(B)起動時に例外処理を用い,以下のようなエラーメッセージを表示させるにはどういった処理を構成すればよいでしょうか。 パス名が設定されていない場合,”ファイルのパス名が見つかりませんでした” 引数が指定されていない場合,”引数が指定されておりません” 原因が特定できないエラーが発生した場合,”原因不明のエラーが発生しました” プログラムの実行にはShellメソッドとSystem.Diagnostics.ProcessクラスのStartメソッドがあるという事がわかりましたが,上記2つのメソッドが自分の意図したい操作に適しているかまでは理解におよんでおりません。 まだプログラミングを始めたばかりという事もあり,右も左もわかりませんが,ご教授お願い致します。
- 締切済み
- Visual Basic
- VB6から他のプログラムを強制終了したい
こんにちは、ただいま、VB6からあるプログラムを強制終了したいのプログラムを作りだいです。 強制終了したいのプログラムがVBのプログラムから起動じゃなくで、VBのプログラム実行する前に起動したのプログラムです。 API関数 TerminateProcess(hProcessHandle, 0&) を使いたいですが、現存のプロセスのProcessHandleを取得できません。 困ってる。 お手数ですが、解決方法が有れば教えてください
- 締切済み
- Visual Basic
- VB6.0 SHELLで起動したプログラムを終了さしたいのですが
(1)メインプログラムから電卓を実行します。 Shell("C:\WINNT\system32\CALC.EXE", 1) (2)メインプログラムで電卓を終了させるにわ、どうすればいいのですか 教えてください。
- ベストアンサー
- Visual Basic
- ActiveX → VB を起動するとCreateObjectできない。
初めまして。 2003Server+IIS6.0の環境でASP内のActiveXからShell関数でvbのexeを実行させる処理を作成しております。 サーバーから直接exeを実行させると正常に動くのですが、Web上からasp→ActiveX→exeを起動させるとテキストに書き込む処理はできるのですが、「CreateObject」文で「ActiveX コンポーネントはオブジェクトを作成できません」というエラーが返ります。 VB内でなぜ「CreateObject」が出来ないのかご存知の方はいますでしょうか。 宜しくお願いいたします。
- ベストアンサー
- Visual Basic
- 別プログラムの終了監視
VisualBasic6.0で別プログラムの終了を監視することはできませんか? 具体的に言うと、ACCESS2000で作ったアプリケーションからVB6.0で作ったEXEを起動させてそのEXEから起動元のACCESSアプリケーションの終了を監視するというものです。 いろいろやってはいるのですがうまくいきません。 誰か教えてください!
- ベストアンサー
- Visual Basic
- vb2005で作成したプログラムはどこに?
vb2005で作成したプログラムはどこに? vb2005で作ったプログラムをビルド後に、 他のPCにsetup(インストール)したとします。 その場合、実行ファイル(.exe?)はどこにあるのでしょうか また、コマンドプロンプトで実行ファイルを起動することは可能でしょうか
- 締切済み
- Visual Basic
- 【VB2005】プログラム実行時に引数を渡したい
VB2005で作成したプログラムがありまして、 Shell("C:\XXX.Exe -Prg=1")というのを使って プログラムをShellで開きます。 そこで、"-Prg=1"という引数を、受け取る側のアプリケーションを 作りたいのですが、どういう方法で値を取得できるか教えてください。 よろしくお願いします。
- ベストアンサー
- Visual Basic
- VBからExcelが起動しません
Excelファイルを開くプログラムをVBで作成したのですが 1つのパソコンだけ実行時エラー5が発生してExcelを起動できません どなたかお助けください プログラムはこんなかんじです WKPATH = "D:\Program Files\Microsoft Office\Office\EXCEL.EXE " & " c:\a.xls" exl = Shell(WKPATH, 1) ちなみにエラーが発生するパソコンはNT4.0sp6です
- ベストアンサー
- オフィス系ソフト