アプリ版:「スタンプのみでお礼する」機能のリリースについて

はじめまして。
掲題の通り、VB.netからshell関数を用いてバッチファイルを起動します。
その後、そのバッチファイルが終了してログファイルの出力を完了した後に、
ファイルを開いて確認したいのです。
thread.sleepなどで大体このくらいかなという時間を待ってみる、
などのやり方しか今は思いつかないのですが、
何か明確にバッチファイルの終了を受け取れる方法は無いものでしょうか。

どなたかご存知の方がいらっしゃいましたらご教授ください。

A 回答 (5件)

Shell関数より Processクラスで実行したほうが簡単に待てますよ



Dim oPro as Process
oPro = Process.Start("..\..\a.bat")
oPro.WaitForExit()
MessageBox.Show("Hello")

といった具合です
    • good
    • 2
この回答へのお礼

ご回答ありがとうございます。
上記のように実装したところ、簡単にできました!
Processクラスですか、知りませんでした。
Processクラスについてもう少し調べてみますね。
ありがとうございました!

お礼日時:2008/06/16 17:12

参考URLの上の方にあると思いますが、Windows Scripting Host の略です。


http://msdn.microsoft.com/ja-jp/library/cc364455 …
Scriptの中で、色々な機能を実施する場合、お世話になるモノです。
試しに以下のコードを実行してみてください。

MsgBox "バッチを始めます。"
CreateObject("WScript.Shell").Run "C:\~\hoge.bat", 1, True
MsgBox "バッチが終わりました。"

バッチファイルのパスは実際の環境に合わせて記述してください。
    • good
    • 0

すでに答え自体は出ていますが、ちょっと調べてみた感じだと、ほぼ


ANo.3のredfox63氏が書かれたProcessクラスを使った方法の一択っぽいですね。

ANo.1の方法については、リンク先に書かれてるのはVB6の記述方法で、
.NETで使うには多少コンバートしないといけません。
おまけに、Option Strict On の設定だと、WScript.Shellのメソッドを書こうとしても
遅延バインディングだと怒られてしまいます。
ANo.2で書かれているソースもVB6用で、Declareで書かれているAPIの定義について、
VB6とVB.NETでは変数のサイズも変更されていたりするので、引数の長さが違うので
変だよ、と怒られている感じです。
As Long を As Integer に変更すれば怒られなくなるかもしれませんが…

ともあれ、簡単に出来る手段が標準で与えられているので、それを使わない手はありませんね。
ちなみに、拡張子に関連付けての実行も、Processクラスを使用すれば出来ます。
これもAPI使うまでもありません。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
やはりそうなのですか。
私もがんばって他のやり方も試してみたものの
いろいろ怒られてしまって。
Processクラスでうまくいきました。
ありがとうございました。

お礼日時:2008/06/16 17:13

下記のコードを実行してみてください。



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
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
上記の通りにやってみましたところ、
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, pid)
の行にて以下のエラーとなりました。

PInvoke 関数 'WindowsApplication1!WindowsApplication1.Form1::OpenProcess' がスタックを不安定にしています。PInvoke シグネチャがアンマネージ ターゲット シグネチャに一致していないことが原因として考えられます。呼び出し規約、および PInvoke シグネチャのパラメータがターゲットのアンマネージ シグネチャに一致していることを確認してください。

なんのことでしょうか。現在調査中です。

お礼日時:2008/06/16 12:37

Shell関数ではなく、WSHのRun、Execメソッドを使ってみては?


http://msdn.microsoft.com/ja-jp/library/cc364421 …
http://msdn.microsoft.com/ja-jp/library/cc364356 …
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
WSHとはいったいなんなのでしょうか?
このサイトに行き同様のコードを記述してみても
wscriptでコンパイルエラーとなってしまいます。
wscriptが何をImportsすればいいものなのか、調べても
わからない状況です。
もう少し調べてみます。

お礼日時:2008/06/16 12:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!