| ■No90556 (TanuTanu さん) に返信 > invokeが気になったので調べてみたら2008年に魔界の仮面弁士 様が回答している件 > がまさに私が悩んでる案件かも知れません。
そもそも何故、UI スレッドとワーカースレッドの間でのやり取りを必要としているのでしょうか。 わざわざスレッドを立ち上げずとも、イベントドリブンな非同期実装にするだけで良いと思うのですが。
もしもスレッドを分けるとしても、複数のスレッドでやりとりしようとせず、 取得から操作までを同一のスレッドで行うべきかと。
それと、IE 側から切断されたまま使おうとすると、COMException や InvalidComObjectException に 陥る可能性がありますので、ShellWindows を列挙した後、そのウィンドウが閉じられた場合に備えて、 OnQuit イベントを捕らえておくことをお奨めします。
■No90557 (PANG2 さん) に返信 > NewWindowイベントなら第一引数で別窓をつかめるはずです。
COM 版の NewWindow イベント だとしたら、第一引数は URL のはず。 ' DWebBrowserEvents::NewWindow ' void NewWindow(BSTR URL, long Flags, BSTR TargetFrameName, VARIANT* PostData, BSTR Headers, [in, out] VARIANT_BOOL* Processed); Sub NewWindow(URL As String, Flags As Integer, TargetFrameName As String, ByRef PostData As Object, Headers As String, ByRef Processed As Boolean)
使うとすれば、NewWindow2 イベントか ' DWebBrowserEvents2::NewWindow2 ' void NewWindow2([in, out] IDispatch** ppDisp, [in, out] VARIANT_BOOL* Cancel); Sub NewWindow2(ByRef ppDisp As Object, ByRef Cancel As Boolean)
もしくは NewWindow3 イベントが良さそうです。 ' DWebBrowserEvents2::NewWindow3 ' void NewWindow3([in, out] IDispatch **ppDisp, [in, out] VARIANT_BOOL *Cancel, /* NWMF */ DWORD dwFlags, BSTR bstrUrlContext, BSTR bstrUrl); Sub NewWindow3(ByRef ppDisp As Object, ByRef Cancel As Boolean, dwFlags As UInteger, bstrUrlContext As String, bstrUrl As String) |