vbから他のexeを呼び出して待機しているのですが
他のexe待機中に、呼ぶだし側のvbのフォームをunloadすると
呼び出し側のプロセスが残ってしまいます。
回避方を教えて下さい。6.0
'Shell使用
Dim hProcess As Long
lret = Shell("c:\windows\calc.exe", vbNormalFocus)
hProcess = OpenProcess(SYNCHRONIZE, 0, lret)
lret = WaitForSingleObject(hProcess, INFINITE)
lret = CloseHandle(hProcess)
MsgBox "終了しました。"
フォームのunloadは
画面が終了するだけですから
他の処理が動いてたら
プロセスは終了しません。
Endを入れるとどうなります?
Endなんてあるのですね
初めて知りました。ありがとうございます
終了を、あまりEndと使われてるのを見ない気がするのですが
何かあるのでしょうか?
よかったらEndを使うことの功罪を教えて下さい
Endは強制終了に近いのであまり使いません。
(Cのexitのようなもの)
今回は、プロセスが残ってしまうVBの不具合かどうかを
確かめるためです。VBの不具合ではないようですね。
WaitForSingleObjectが終了してないため
プロセスが残るのでしょう。
GetExitCodeProcess
で起動状態を監視したほうがいいかも。
Private Sub ShellEnd(ProcessID As Long)
Dim hProcess As Long
Dim EndCode As Long
Dim EndRet As Long
'ハンドルを取得する
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 1, ProcessID)
'終わるまで待つ
Do
EndRet = GetExitCodeProcess(hProcess, EndCode)
DoEvents
Loop While (EndCode = STILL_ACTIVE)
'ハンドルを閉じる
EndRet = CloseHandle(hProcess)
End Sub
これを使って電卓起動後、プロセス中かどうかを調べて
この後の処理を分岐させるようにしました。
電卓終了せずフォームをunloadで終了すると
終了したexeのプロセスが残ってしまい。
2重起動エラーにかかってしまいます。
回避するにはやはり
Endしてしまうしかないのでしょうか?
> '終わるまで待つ
> Do
> EndRet = GetExitCodeProcess(hProcess, EndCode)
> DoEvents
> Loop While (EndCode = STILL_ACTIVE)
ここを工夫して、unloadの時もループを抜けるようにすればいいですね。
手っ取り早いのはEndです。。
ツイート | ![]() |