- - PR -
VB6 WaitForSingleObjectについて
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2009-01-30 17:43
TOMと申します。
VB6で開発保守をしています。 以下のソースで聞きたい事があります。 やりたい事は、ShellExecuteExで関連付けされたソフトからファイルを立ち上げ、 その終了を待って(同期して)VBプログラムを継続して動作させたいのです。 @の箇所にブレイクポイントを置いて実行すると、関連付けされたソフトが起動し、 ソフトの終了をすると直ぐに制御が返ってきます(Aのメッセージボックスが表示される)。 @の箇所にブレイクポイントを置かないで実行すると、かなり時間が掛かって制御が 返ってきます。WORDの場合はすごくて、30秒位で以下のメッセージが表示されます。 「予想以上に時間のかかる処理です。継続しますか?」 WaitForSingleObjectを呼び出す前に止める/止めないで待ち時間が変わってしまいます。どなたか解決方法を教えて下さい。 宜しくお願いします。 -----標準モジュールで定義------------------- Public Const SEE_MASK_NOCLOSEPROCESS = &H40 Public Const SW_SHOWNORMAL = 1 -------------------------------------------- -----プログラム----------------------------- Dim lpExecInfo As SHELLEXECUTEINFO Dim lret As Long With lpExecInfo .cbsize = Len(lpExecInfo) .fMask = SEE_MASK_NOCLOSEPROCESS .hWnd = Me.hWnd .lpVerB = "Open" .lpFile = wk_file .lpParameters = vbNullChar .lpDirectory = vbNullChar .nShow = SW_SHOWNORMAL End With lret1 = ShellExecuteEx(lpExecInfo) lret = lpExecInfo.hInstApp If lret < 32 Then MsgBox ("関連づけされたアプリケーションがありません。") Exit Sub End If '@終了するまで待機する lret2 = WaitForSingleObject(lpExecInfo.hProcess, INFINITE) 'Aメッセージ表示 msg = MsgBox("更新します。よろしいですか?", vbYesNo, "確認") _________________ | ||||
|
投稿日時: 2009-01-31 13:01
以下、ShellExecuteEx や WaitForSingleObject を使うべきかや、ほかのやりかたはどうか、などのような話題はせず、あくまでも現状のコードについての言及をします。
提示されたコードを私の環境で動かしてみましたが、たしかにおっしゃるような現象が起きることを確認できました。
ちなみに、この行の直前に MsgBox を呼び出すコードを追加すると、時間がかからず、デバッガーで止めたのと同様の効果が得られました。 したがって、推測としてはウィンドウメッセージ絡みのことなのかな?とも思います。 また、開くファイルを .doc の Microsoft Word ではなく、.bmp にして "Windows Picture and Fax Viewer" を起動するようにした場合は、とくにそれらのことをしなくても時間がかかりません。 これ以上は今のところ私には分かりませんが、ご参考まで。 | ||||
|
投稿日時: 2009-01-31 22:03
あくまで推測ですよ。
ShellExecuteは拡張子の関連付けの設定によってはDDE経由で動作します。DDEはメッセージを使うので動かない可能性はあるかと。lpExecInfo.hWndをデスクトップウィンドウなどにしてはどうでしょう? | ||||
|
投稿日時: 2009-02-02 09:04
unibonさん、甕星さん
返信ありがとうございます。 unibonさんの回答の様に、msgboxを追加したら問題は起きなくなりました。 解決策ではないですが、回避策になると思います。 Msgboxの表示でユーザに確認してみます。 ありがとうございました。 _________________ |
1