• ベストアンサー

Shell関数からバッチファイルを起動後に、バッチファイルが終了するまで待ちたい。

kikujackの回答

  • kikujack
  • ベストアンサー率47% (17/36)
回答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 GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Const PROCESS_QUERY_INFORMATION = &H400 Const STILL_ALIVE = &H103 Private Sub Command1_Click() Dim pid As Long pid = Shell("c:\a.bat", vbNormalFocus) hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, pid) Do Call GetExitCodeProcess(hProcess, ExitCode) DoEvents Loop While ExitCode = STILL_ALIVE Call CloseHandle(hProcess) MsgBox ("ok") End Sub

gawein193
質問者

お礼

ご回答ありがとうございます。 上記の通りにやってみましたところ、 hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, pid) の行にて以下のエラーとなりました。 PInvoke 関数 'WindowsApplication1!WindowsApplication1.Form1::OpenProcess' がスタックを不安定にしています。PInvoke シグネチャがアンマネージ ターゲット シグネチャに一致していないことが原因として考えられます。呼び出し規約、および PInvoke シグネチャのパラメータがターゲットのアンマネージ シグネチャに一致していることを確認してください。 なんのことでしょうか。現在調査中です。

関連するQ&A

  • Shell関数はOSに依存?

    現在VB4からVB6へのコンバージョン作業を行っています。 その際、 VB4→Windows98 VB6→Windows2000XP と、異なるOSを使用しています。 VB6の環境では、Shell関数を使用してMS-DOS バッチ ファイルの起動を行えるのですが、VB4の環境では同じコーディングでもバッチファイルが起動しない&エラーが出力されませんでした。 現在はVB4の環境をWindows95へ移す事で問題を回避したのですが (VB4の環境は比較テストに使用するだけでしたので) 98だから使えないと言うのも気持ちが悪く、質問させていただきました。 どなたかShell関数の上記点への対応策等ご存知でしたらご教授願います。

  • shell関数について

    毎度、お世話になっています。 現在、C言語で書いた複数のプログラムをBATファイルで処理するように記述しています。VBでその制御を行っているのですが、VBの処理手順として子フォーム(textあり)にデータを書きこんで、ボタンを押すとshellでbatファイルを起動し、バッチファイルの結果として、あるディレクトリにresult.txtが作成され、VBで他の子フォームに読みとらせようとしているのですが、shellだと、実行の終了を待たずに次にいってしまうので、そのバッチファイルの実行処理が終わらず、result.txtの内容を読み込むことができません。 待つようにするにはどうすればよいのでしょうか? ちなみにVBは一週間前にはじめて、自分でも調べてなんとか作ろうとしたのですが、時間がないため、ここに質問させていただきました。なるべく簡単なアルゴリズムで、よろしくお願いします。 VBのプロセス    テキストにデータを書き込む      ↓     ボタン   →        テキストの内容を*.txtとして保存                        ↓                      バッチファイル起動    ↓(ここで右の実行を待たない     ↓     ので読み込むことができない)   C言語で書かれたプログラム実行                        ↓ result.txtを    ←        結果としてresult.txtが出来上がる 読み込んで表示     

  • バッチファイルについて・・・

    バッチファイルというのはVBから操作できないのですか? Shellを使っているのですが、うまくいきません。 バッチファイルをダブルクリックするとうまくいくのです。。。

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

    お世話になります。 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

  • Shell関数で起動したメディアプレーヤーを終了したい。

    以前このコーナーで質問して教えて頂いたShell関数でメディアプレーヤーを起動できました。(以下にそのコーディングを記載しました) 今度は起動したメディアプレーヤーをVBから終了する方法が知りたいのですが教えて頂けませんか。 Shell ("C:\Program Files\Windows Media Player\wmplayer.exe /1 G:\TEST.wma ,vbMinimizedFocus") 宜しくお願いします。

  • Access2000vbaで、shell関数で起動させたExcellを終了する方法を教えてください。

    Access2000vbaで、shell関数で起動させたExcellを終了する方法を教えてください。 以下のように、shell関数で、既存のExcelファイルを起動させました。 どうすれば、Excelファイルを終了できますか? 宜しくお願いします。 Dim fl_name As String fl_name = "C:\XE2.xls" Shell "C:\Program Files\Microsoft Office\Office\EXCEL.EXE " & fl_name, vbNormalFocus

  • Shell関数の終了を調べる方法

    Shell()関数を使ってほかのアプリケーションを起動し、終了を待つというよくある件なのですが、 ちょっと古くて、VB4.0の16ビット版による開発で、 動作環境はWindosXP(32ビット)です。 下記のように記述していますが、Shellの戻り値が&HFFFFを超えるためか、うまくいかないときがあります。 Private Declare Function GetModuleUsage Lib "Kernel" _ (ByVal hModule As Integer) As Integer Private Sub Command1_Click() Dim hInst As Integer hInst = Shell("calc.exe", vbNormalFocus) While GetModuleUsage(hInst) <> 0 DoEvents Wend MsgBox " 終了しました ", vbInformation End Sub ただしWindows98でも動作する必要があるので、32ビットにしてしまうというのはなしです。 どのようにしたらうまくいくのでしょうか? アドバイスください。お願いします。

  • WSHで他のバッチを呼びその終了を待つ方法

    WSHでプログラミングをしています。 WSHを使う理由はWin上から簡単にメールを送信できるのでとりあえず選択しました。 で、WSHのバッチから、普通のDOSコマンドで記述したバッチを呼んで、そのバッチの結果出力されたログファイルをWSHのバッチでメールに添付して送信したいなどと思っています。 今は var ws = WScript.CreateObject("Wscript.Shell"); ws.run("tmp.bat"); こんな感じで「tmp.bat」という名のDOSコマンドのバッチを呼び出しているのですが、このコマンドは命令発行したらその命令が終了するのを待たず次の命令に進んでしまうようです。 なので、ログ作成とメール送信のタイミングが合わない状態です。 処理待ちする方法を教えてください。よろしくお願いします。

  • バッチファイルの同時起動を防ぎたい

    現在バッチファイルを二つ(A,B)作っております。 Aというバッチファイルを実行し完了するまで、Bというバッチファイルを実行させないようにしたいです。(逆も同様に) バッチの処理完了時間はA,B共に15秒~30秒程です。 いろいろと調べてみたのですがバッチの最初にロックファイルを作成し、実現しようかと思っています。(バッチ終了時にはロックファイルを消す処理も入れます。) また、ロックファイルを作成した後に意図せずwindowsが落ちた場合、ロックファイルが削除されず、ロックされたままになってしまう可能性もあると知りました。この場合ファイルのタイムスタンプを作成し、ロックファイルの更新日時と現在時刻の差分が1分以上ならば異常な処理があったとみなし、ロックファイルを削除をしようと考えています。 ここで質問なのですが、ロックファイルの作成はできたのですが、更新日時と現在時刻の差分をバッチで記述する方法がわかりません。調べはしたのですが、いまいちよくわからず。 どなたか、サイトまたはソースをご教授願います。 環境はwindows10です。

  • バッチファイルでファイル数計算

    現在仕事で一日に大量のファイルが作成され、それの集計を行っています。ですので、そのファイルの集計を行えるバッチファイルを作成していますが、思ったものができません。 特定のファイル数の集計は行えるのですが、作成された時間おきに集計できるようにしたいんです。 例えば、 9:00に2ファイル作成された バッチファイル実行→ログには9:00分が出力 (ファイル名及びファイル数2がログとして出力) 10:00には50ファイル作成された バッチファイル実行 ↓ ログに以下が出力 9:00に出力分 10:00に出力分(ファイル名及びファイル数が50としてログ に出力) このようなことをバッチファイルで作成する事は無理でしょうか? ご助言宜しくお願い致します。