|
こんにちは。教えていただいたことも元にして、下記のサンプルコードを試してみたところ@の部分でのキャストエラーが解消されました。 しっかり理解できているわけではないのですが、COMオブジェクトはメインスレッドのWindowsフォーム(STA)に作成されて、 マーシャリングして使用することにより問題が解決されたのかなと思っております。
COMオブジェクトをBackgroundWorker(別スレッド)から使用した場合、 すべてキャストエラーになるわけではなく、特定のメソッドのみが使えなかったので windowsの環境の問題なのかと、分からないまま約1カ月くらい悩んでおりました;
自分でThreadを作成し、その中ですべてを処理する方法については、今度テストしてみたいと思います。 キャストエラーは解消されたので、掲示板の方は一旦解決とさせて頂きます。 質問して本当によかったです。ありがとうございましたっ!
'−−−−−サンプルコード Public WithEvents objIE As SHDocVw.InternetExplorer = Nothing Public WithEvents BW As New System.ComponentModel.BackgroundWorker Delegate Sub DelegateTest()
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Call test() '・・・通常の呼び出し End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click BW.RunWorkerAsync() End Sub
Private Sub BW_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) _ Handles BW.DoWork Call test() '・・・スレッドからの呼び出し End Sub
Private Sub test() If objIE Is Nothing Then 'COMオブジェクトの作成はスレッドからでもOKでした。 objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.Navigate("http://jeanne.wankuma.com/") While (objIE.ReadyState <> 4 Or objIE.Busy = True) System.Threading.Thread.Sleep(100) End While System.Threading.Thread.Sleep(5000) 'フレーム表示待ち End If
If InvokeRequired Then ' 別スレッドから呼び出された場合 Invoke(New DelegateTest(AddressOf test)) Return End If
Dim objDoc As MSHTML.HTMLDocument = objIE.Document Dim frms As MSHTML.FramesCollection = objDoc.frames '・・・@(キャストエラー解消) Dim frm As MSHTML.HTMLWindow2 = frms.item(1) Dim frmDoc As MSHTML.HTMLDocument = CType(frms.document, MSHTML.HTMLDocument)
Debug.Print(frmDoc.body.innerText) End Sub
|