• ベストアンサー

実行可能ファイルの同期?

外部の実行可能ファイル(いわゆるEXE)を実行させるのに shell関数を利用しています。 この関数は非同期に実行してしまうのですが、これを 同期させる方法をご存知の方はいらっしゃいませんでしょうか?

  • s13
  • お礼率38% (19/49)

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

  • ベストアンサー
  • mfuku
  • ベストアンサー率50% (173/345)
回答No.2

以下、それを実現するプロシージャの例です(インデントが崩れて読みづらいかもしれません)。 ご参考ください 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 InStr(strExeName, "\") = 0 Then 'カレントディレクトリの指定ファイル名を取得 ' strExeName = App.Path & "\" & strExeName 'End If 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

s13
質問者

お礼

ご回答、ありがとうございます。 早速やってみます。 結果は後ほど・・・

その他の回答 (1)

  • KojiS
  • ベストアンサー率46% (145/312)
回答No.1

できません。 呼び出し元プログラムで終了まで待つしかありません。

関連するQ&A

  • VBAのShellの同期的実行

    ExcelVBAについての質問です。コマンドプロンプトで実行するプログラムをCで作成しました(これをXXX.exeとします)。このプログラムは計算が終了した後で、その結果のファイルを作成します(これをYYY.txtとします)。このプログラムを操作し、結果を表にして出力するために、ExcelVBAでshellを使って以下のようなプログラムを作成しました。   shell("XXX.exe")   call Output Outputでは、XXX.exeが作成したファイルYYY.txtからデータを読み込んでシートに結果を出力するのですが、うまくファイルを読み込みません。多分、shellにより実行したXXX.exeが終了する前にOutputが呼ばれているのだと思うのですが、もしそうだとしたらどのような解決方法があるのでしょうか。よろしくお願いします。 WinXp、Excel2000です

  • VC++から引数付きexeファイルの実行

    タイトルの通り、VC++から外部ファイルを実行したいのですがどのような関数を使えばよいのでしょうか? exeファイルを実行中は親プロセスであるVCのプログラムの方を止めておきたいのです。 出来ればexeファイルは引数付きで実行したいと思いますので、よろしくお願いします。 開発環境はVisualStudio2005です。

  • 実行ファイルからdllを呼び出す際の情報について

    実行ファイル(exe)とdllの各バイナリだけあるとします。 exeがdllを呼び出す際の関数名とパラメータの内容を、外部ツール等で 簡単に参照することはできますでしょうか? 何かしら方法があるなら教えていただけると助かります。

  • スタートメニューの「ファイル名を指定して実行」の本体の名称

    業務上VBによりプログラムを組む場合があるのですが、わけあって「ファイル名を指定して実行」をShell関数で呼び出そうと思っています。 そこでこのスタートメニューの「ファイル名を指定して実行」の本体(EXE)ファイルの名称御存じの方いらっしゃいませんか? 直接APIからでも結構です。よろしくお願いします。

  • Shell関数?非同期?

    エクセルVBAで SHELL関数はSHELL関数より上の文の計算がすべて終わってから実行されるのでしょうか? 非同期はSHELL関数より下の文の話ですよね??

  • VBでコマンドラインを実行したい!

    VBのソースからVBScriptを起動させたいんですが、 Shell関数ではEXEファイルしか実行できないみたいで うまくいきません。何かいい方法はないでしょうか? 実行したいコマンドラインは以下の通りです。 hoge.vbs 5 5を引数で渡したいんですがどうすればいいでしょうか? よろしくお願いします。

  • VB6.0から起動したexeファイルを終了するとエラーが発生して困っています

    VB6.0(OSはWindowsXP)中からShell関数を利用してexeファイルを起動したのですが、そのexeファイルを終了すると決まってアプリケーションエラーが発生します。これを直接かショートカットで実行して終了するとエラーは出ません。どなたか考えられる原因や解決策をご存じの方、教えて頂けませんでしょうか?よろしくお願い致します。

  • 外部ファイルを実行するには?

    お世話になります。 vb6で外部のバッチファイルを起動して、それを動作させようとしているのですが、うまくいきません。特にエラーにはならず、一瞬DOSプロントは立ち上がるんですが、バッチ処理しているログにはなにも書き込まれません。普通にバッチファイルをダブルクリックさせるか、コマンドからバッチファイルの入っているフォルダまでいって、バッチファイルを実行すれば書き込まれるのですが。 どこがまちがっているのでしょうか?shellじゃなくて、違う関数を使わなければいけないのでしょうか?ご教授よろしくお願いします。 なお、vb6でテストするときは▸マークの実行を押して、テストしました。 サンプル用のものです。 ↓test 現在の時間をログに記入 ■バッチファイルの中身(test.bat) echo test >> log.txt time/t >> log.txt ■vb6のファイルの中身 Private Sub Command1_Click() Dim ret as long ret = shell("cmd.exe /c C:\test\test.bat",4) End Sub

  • VBで「ファイル名を指定して実行」と同様の動きを再現

    VB6、WindowsXP VBのプログラムからあるフォルダを開きにいく単純なプログラムを作成しています。 通常のローカルフォルダであれば、Shell関数でExplorer.exeにパスを渡すだけで問題ないのですが、うまくいかないのは、 開きにいくパスがネットワークパス(\\[サーバ名]\[共有名])の場合で、サーバーにアクセスするのに認証が必要となる場合です。 ファイル名を指定して実行に「\\[サーバ名]\[共有名]」を打ち込んで実行した場合は、Windowsが出してくる認証ダイアログ(ユーザ名、パスワードを聞いてくる)が表示されて、ユーザーが正しいID、パスワードを入力すれば、エクスプローラで共有フォルダが開きます。 この動きがまさにやりたいことなのですが、 Shell関数を使用した場合、引数に「Explorer.exe \\[サーバ名]」と指定した場合はファイル名を指定して実行と同じなのですが、 「Explorer.exe \\[サーバ名]\[共有名]」を指定した場合、認証ダイアログが表示されずにエラー(ディレクトリが無効というような)となってしまいます。おそらく先にサーバ認証を行わずに直接共有を見に行ってしまって存在が掴めないのだと思います。 VBでファイル名を指定して実行と同様の動きを再現する方法をどなたかご存知ないでしょうか? 尚、shellexecuteやVB.NETでprocess.startなどでもやってみましたがshell関数と同じ動きでした。

  • クライアントからサーバーの実行ファイルをサーバー側で実行したい

    サーバーもクライアントもWindowsの環境で、Visual Basic 2005 を使い、クライアントからサーバーにある 実行ファイル(.exe)をサーバー側で実行したい のですが、どうもうまくいきません。shell 関数や Process.Start メソッドを使い、httpプロトコル (http://~)で実行ファイルを指定するようにした のですが、クライアント側で実行しようとします。 また、コマンドライン引数を指定したいです。 もちろん、サーバー側にはWebサーバー(IISのWWW サービス)をインストールしてあります。 UNIX系のrsh(リモートシェル)に相当するような 機能をWindowsでは実現できないのでしょうか? お分かりの方いらっしゃいましたらご教授のほど よろしくお願いします。

専門家に質問してみよう