毎度、お世話になっています。
現在、C言語で書いた複数のプログラムをBATファイルで処理するように記述しています。VBでその制御を行っているのですが、VBの処理手順として子フォーム(textあり)にデータを書きこんで、ボタンを押すとshellでbatファイルを起動し、バッチファイルの結果として、あるディレクトリにresult.txtが作成され、VBで他の子フォームに読みとらせようとしているのですが、shellだと、実行の終了を待たずに次にいってしまうので、そのバッチファイルの実行処理が終わらず、result.txtの内容を読み込むことができません。
待つようにするにはどうすればよいのでしょうか?
ちなみにVBは一週間前にはじめて、自分でも調べてなんとか作ろうとしたのですが、時間がないため、ここに質問させていただきました。なるべく簡単なアルゴリズムで、よろしくお願いします。
VBのプロセス
テキストにデータを書き込む
↓
ボタン → テキストの内容を*.txtとして保存
↓
バッチファイル起動
↓(ここで右の実行を待たない ↓
ので読み込むことができない) C言語で書かれたプログラム実行
↓
result.txtを ← 結果としてresult.txtが出来上がる
読み込んで表示
No.5ベストアンサー
- 回答日時:
あと、拡張エラー情報を取得してどのようなエラーか確認をしてみてください。
APIのヘルプではGetLastError()を使用してと記述されていますが、VBでは、Err.LastDllErrorで取得できます(というか、これで取得しないと違うエラー値が返される可能性があります)
http://www.microsoft.com/JAPAN/developer/library …
http://www.microsoft.com/JAPAN/developer/library …
参考URL:http://www.microsoft.com/JAPAN/developer/library …
お礼が遅くなってすみません。
もう一度、taka_tetsuさんの方法で組み直してバッチファイルの操作を行いました。結果として正常に動作しました。
エラーが出ていた時のプログラムはNo2さんの方法で上書きしてしまって、
結局、何が悪かったが分からなかったのですが。。
ちょっと釈然とせず、すみません。
taka_tetsuさんの意見を今後の参考とさせてもらいます。
ありがとうございました。
No.4
- 回答日時:
>ですが、以下のWaitForSigleObjectの返り値がWAIT_FAILEDになって
>しまい待機失敗をしていることがわかったのですが、
待機の前にバッチファイルは起動するはずなんですけどね。
ということで、待機に失敗する理由は、おそらくCreateProcessで
起動に失敗したからです。
CreateProcessの戻り値を調べてください。
お返事が遅れてすみません。
ats8181oyajiさんの方法で一応解決ができました。
しかし、taka_tetsuさんの方法でもやってみようと考えています。原因がわかるまで。。。
言い訳になってしまうかもしれませんが、ちょっと今、非常に忙しい状態で、あと1ヵ月ぐらい続きそうです。なかなかtryする暇がありません。現在、3日に1度は寝ずに研究をやっている状態で偏頭痛まで伴っています。
必ず、結果を書き込みますので、一時の間、締め切らずにこのままにしておきます。私事によってtaka_tetsuさんが気にかけられておられ申し訳ありませんが、その旨よろしくお願いします。
No.3
- 回答日時:
お馬鹿な手法です。
参考にもならないかも・・・1.ボタンを押されたタイミングで、システム日時を取得→sDate
2.指定ファイルの更新日付を取得
(毎回ファイルを新規で作成するなら、ファイルの有無のチェックで良いと思う)
3.sDateより大きくなっていたら、更新済みなので4番へ
そうでないなら、また2番へ
※条件が一致するまで2・3を繰り返す。そのときに待ち時間を入れたり
画面がロック状態にならないようにする必要はあると思います。
4.ファイルより内容の取得
こんな流れでは、如何でしょう?。
う~ん試していないのでわからないのですが、処理が終わるまで、適当な処理を行うループをさせていたのですが、動作が極端に鈍くなってしまいました。
様様な面でBlueRayさんが提案してくれた方法を試してみたいと思います。
ありがとうございました。
No.2
- 回答日時:
こんにちは
私はこの方法で待機しています。
ソースをそのままコピーします。
.bas
'* Shell起動プロセスとの同期
'Shell起動プロセスのオープン(状態の取得準備)
Public Declare Function OpenProcess Lib "KERNEL32" _
(ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _
ByVal dwProcessId As Long) As Long
'Shell起動プロセスとのシンクロ(待機する)
Public Declare Function WaitForSingleObject Lib "KERNEL32" _
(ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
'Shell起動プロセスのクローズ(終了)
Public Declare Function CloseHandle Lib "KERNEL32" _
(ByVal hObject As Long) As Long
'Shell起動プロセスが実行中か調べる(状態の取得)
Public Declare Function GetExitCodeProcess Lib "KERNEL32" _
(ByVal hProcess As Long, lpExitCode As Long) As Long
Public Const SYNCHRONIZE = &H100000
Public Const INFINITE = &HFFFF
.frm
IDProcess = Shell("command.com /c " 実行プログラム)
hProcess = OpenProcess(SYNCHRONIZE, 1, IDProcess) 'SYNCHRONIZE = &H100000
ret = WaitForSingleObject(hProcess, INFINITE) 'INFINITE = &HFFFF
ret = CloseHandle(hProcess)
ちょっと長いですけど。頑張ってください
No.1
- 回答日時:
情報ありがとうございました。
しかしエラーが発生してバッチファイルが動作しません。
デバッグをかましてどこでプログラムが停止しているのか見たので
ですが、以下のWaitForSigleObjectの返り値がWAIT_FAILEDになって
しまい待機失敗をしていることがわかったのですが、
udtProcessInfomation.hProcessが何の情報を表しているのかや、何が
間違っているのかわからずお手上げ状態です。
もし、御分かりになられるようでしたら、よろしくお願いします。
lngWaitForObjectEvent = _
WaitForSingleObject(udtProcessInfomation.hProcess, _
lngWaitForObjectTimeOut)
With Label4 ' 待機結果を表示
Select Case lngWaitForObjectEvent
Case STATUS_WAIT_0
.Caption = "プロセスは終了"
Case WAIT_TIMEOUT
.Caption = "待機はタイムアウト"
Case WAIT_FAILED
.Caption = "待機は失敗"
End Select
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) python OpenPyXLを使って出力結果をエクセルに書き込み 2 2022/06/04 19:46
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- Visual Basic(VBA) VBAでの共有パスにつきまして 1 2023/03/04 17:24
- その他(プログラミング・Web制作) フォルダ内の特定 拡張子のファイルを一括実行するBat ファイルについて 4 2022/04/17 09:51
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 入力待ちをして、受け取った正の整数が表す行数だけ既存 4 2022/07/05 10:12
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2023/02/03 13:18
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- システム CPUの問題について 2 2022/07/09 12:04
- その他(プログラミング・Web制作) ファイル名の一部をbatで変更したい batファイルを使って、以下のようにファイル名の一部を変更した 3 2023/02/21 20:09
- オープンソース Coinmarketcap api 1 2022/05/30 15:47
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBでExcelが起動されているか知...
-
Linux環境変数設定(putenv?se...
-
バッチスクリプト処理でエラー...
-
コンソールアプリの起動結果待...
-
CSHが使えない REDHAT
-
誰かにサーバにあるデータを消...
-
CygwinをインストールしたけどX...
-
ソフトのインストール場所って...
-
linuxのフォルダと配置について
-
バッチで削除したフォルダをイ...
-
ネットワーク接続を確認する手...
-
.cshrcでのエラー
-
PowerShellで自分が書いたコマ...
-
エクセルVBA 実行時エラー 5029...
-
Linux●前の行に戻れません...
-
aptでインストールしたプログラ...
-
ログに特定の文字が含まれてい...
-
linuxのsshの反応が非常に遅い。
-
メーリングリスト宛てのメール...
-
バッチファイルでのスペースの入力
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッチスクリプト処理でエラー...
-
バッチファイルで多重起動を防ぐ
-
VBでExcelが起動されているか知...
-
Linux環境変数設定(putenv?se...
-
コンソールアプリの起動結果待...
-
「応答なし」の状態を監視する方法
-
_access関数が EACCES エラーと...
-
Open Office Org 急に起動しな...
-
VBを用いてログオフから自動で...
-
起動したIEのウインドウタイ...
-
OLEサーバコンポーネントを作っ...
-
MySQLへのDB::connectで、faile...
-
ASP.NET 2.0(VB)からEXCELオブ...
-
CreateProcessでコンソールアプ...
-
プリンタの状態を知る方法
-
RTOS(TOPPERS)プログラムで、動...
-
VB6 二重起動確実防止について
-
system関数について
-
デーモンプロセスの起動について
-
仮想メモリ増加
おすすめ情報