- PR -

VB6 WaitForSingleObjectについて

1
投稿者投稿内容
TOM
会議室デビュー日: 2008/05/27
投稿数: 9
投稿日時: 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, "確認")

_________________
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2009-01-31 13:01
以下、ShellExecuteEx や WaitForSingleObject を使うべきかや、ほかのやりかたはどうか、などのような話題はせず、あくまでも現状のコードについての言及をします。

提示されたコードを私の環境で動かしてみましたが、たしかにおっしゃるような現象が起きることを確認できました。
引用:

TOMさんの書き込み (2009-01-30 17:43) より:
'@終了するまで待機する
lret2 = WaitForSingleObject(lpExecInfo.hProcess, INFINITE)


ちなみに、この行の直前に MsgBox を呼び出すコードを追加すると、時間がかからず、デバッガーで止めたのと同様の効果が得られました。
したがって、推測としてはウィンドウメッセージ絡みのことなのかな?とも思います。

また、開くファイルを .doc の Microsoft Word ではなく、.bmp にして "Windows Picture and Fax Viewer" を起動するようにした場合は、とくにそれらのことをしなくても時間がかかりません。

これ以上は今のところ私には分かりませんが、ご参考まで。
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2009-01-31 22:03
あくまで推測ですよ。

ShellExecuteは拡張子の関連付けの設定によってはDDE経由で動作します。DDEはメッセージを使うので動かない可能性はあるかと。lpExecInfo.hWndをデスクトップウィンドウなどにしてはどうでしょう?
TOM
会議室デビュー日: 2008/05/27
投稿数: 9
投稿日時: 2009-02-02 09:04
unibonさん、甕星さん

返信ありがとうございます。
unibonさんの回答の様に、msgboxを追加したら問題は起きなくなりました。
解決策ではないですが、回避策になると思います。
Msgboxの表示でユーザに確認してみます。

ありがとうございました。
_________________
1

スキルアップ/キャリアアップ(JOB@IT)