• ベストアンサー

VBで別のプログラムを起動し他の処理を中断したい

VBプログラムの実行中に、shell("hoge.exe")で別のプログラムを起動しそのプログラムが終了すれば次の処理に移るという処理をしたいんですが、実現方法がわかりません。どうすればよいでしょうか?アドバイスよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • maruru01
  • ベストアンサー率51% (1179/2272)
回答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

その他の回答 (3)

  • jincyan
  • ベストアンサー率36% (4/11)
回答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

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.2

#1の方に補足です。 API ビューアだと INFINITE が &HFFFFになっていますが 実際は INFINITE=&HFFFFFFFF かと思います。 &HFFFFだと65秒でタイムアウトしませんか? (実際確かめてないので自信はありません。間違ってたらごめんなさい。)

  • mfuku
  • ベストアンサー率50% (173/345)
回答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

  • 【VB2005】別のプログラムから別のプログラム起動

    "A"というVB2005で、作成したプログラムがありまして、 メインのフォームがあり、 そこにボタンがあります。 Shellの関数を使って、クリックイベントで、 指定したExe"B"を立ち上げます。 そのExe"B"は、VB2005で作成したオリジナルのプログラムです。 プロジェクトは別で作った物と考えてください。 Exe"B"を起動した画面を[フォーム1]と考えて、 ボタンがあり、クリックすると 別の[フォーム2]が表示するはずなのですが、 特にエラーも掴まずに、Showで開くことができません。 しかし、Exe"B"からダイレクトに起動させて ボタンをクリックしたら[フォーム2]が表示されます。 どうしたら、Exe"A"からExe"B"を起動して Exe"B"からフォーム2を呼び出すことができるか、 考えられる要因などをアドヴァイスして頂けたら助かります。

  • VBプログラムの終了

    VB6.0で作成した実行ファイル(exe)を終了させても タスクマネージャのプロセスに残ってしまい、 もう一度プログラムを起動することができません。 (プログラムで二重起動防止の処理をしています) このプログラムをVBのラインタイムが入っていない マシンで動かしているのですが、 やはりそれが問題なのでしょうか? それとも別に何か原因があるのでしょうか?

  • vb プログラムの起動と例外処理

    はじめまして プログラムの実行と例外処理に関して質問させていただきます。 現在,visual basic2005でプログラム(A)からvbで作成した別のプログラム(B)に引数を指定してから起動し,別のプログラム(B)が例外処理に関する方法を調べています。 プログラム(B)起動時に例外処理を用い,以下のようなエラーメッセージを表示させるにはどういった処理を構成すればよいでしょうか。 パス名が設定されていない場合,”ファイルのパス名が見つかりませんでした” 引数が指定されていない場合,”引数が指定されておりません” 原因が特定できないエラーが発生した場合,”原因不明のエラーが発生しました” プログラムの実行にはShellメソッドとSystem.Diagnostics.ProcessクラスのStartメソッドがあるという事がわかりましたが,上記2つのメソッドが自分の意図したい操作に適しているかまでは理解におよんでおりません。 まだプログラミングを始めたばかりという事もあり,右も左もわかりませんが,ご教授お願い致します。

  • VB6から他のプログラムを強制終了したい

    こんにちは、ただいま、VB6からあるプログラムを強制終了したいのプログラムを作りだいです。 強制終了したいのプログラムがVBのプログラムから起動じゃなくで、VBのプログラム実行する前に起動したのプログラムです。 API関数 TerminateProcess(hProcessHandle, 0&) を使いたいですが、現存のプロセスのProcessHandleを取得できません。 困ってる。 お手数ですが、解決方法が有れば教えてください

  • VB6.0 SHELLで起動したプログラムを終了さしたいのですが

    (1)メインプログラムから電卓を実行します。  Shell("C:\WINNT\system32\CALC.EXE", 1) (2)メインプログラムで電卓を終了させるにわ、どうすればいいのですか  教えてください。

  • ActiveX → VB を起動するとCreateObjectできない。

    初めまして。 2003Server+IIS6.0の環境でASP内のActiveXからShell関数でvbのexeを実行させる処理を作成しております。 サーバーから直接exeを実行させると正常に動くのですが、Web上からasp→ActiveX→exeを起動させるとテキストに書き込む処理はできるのですが、「CreateObject」文で「ActiveX コンポーネントはオブジェクトを作成できません」というエラーが返ります。 VB内でなぜ「CreateObject」が出来ないのかご存知の方はいますでしょうか。 宜しくお願いいたします。

  • 別プログラムの終了監視

    VisualBasic6.0で別プログラムの終了を監視することはできませんか? 具体的に言うと、ACCESS2000で作ったアプリケーションからVB6.0で作ったEXEを起動させてそのEXEから起動元のACCESSアプリケーションの終了を監視するというものです。 いろいろやってはいるのですがうまくいきません。 誰か教えてください!

  • vb2005で作成したプログラムはどこに?

    vb2005で作成したプログラムはどこに? vb2005で作ったプログラムをビルド後に、 他のPCにsetup(インストール)したとします。 その場合、実行ファイル(.exe?)はどこにあるのでしょうか  また、コマンドプロンプトで実行ファイルを起動することは可能でしょうか

  • 【VB2005】プログラム実行時に引数を渡したい

    VB2005で作成したプログラムがありまして、 Shell("C:\XXX.Exe -Prg=1")というのを使って プログラムをShellで開きます。 そこで、"-Prg=1"という引数を、受け取る側のアプリケーションを 作りたいのですが、どういう方法で値を取得できるか教えてください。 よろしくお願いします。

  • 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です

専門家に質問してみよう