私はC#で書かれたBHOを持っています。初期化はメイン スレッドの DocumentComplete イベント ハンドラで実行され、別のスレッドを開始し、そのスレッドで IMarkupServices を使用したいのですが、次のエラーが発生します。
System.InvalidCastException: タイプ 'mshtml.HTMLDocumentClass' の COM オブジェクトをインターフェイス タイプ 'mshtml.IMarkupServices' にキャストできません。IID '{3050F4A0-98B5-11CF-BB82-00AA00BDCE0B}' を持つインターフェイスの COM コンポーネントでの QueryInterface 呼び出しが次のエラーのために失敗したため、この操作は失敗しました: No such interface supported (HRESULT からの例外: 0x80004002 (E_NOINTERFACE)) .
初期化の方法は次のとおりです。
void ieInstance_DocumentComplete(object pDisp, ref object URL)
{
InternetExplorer explorer = pDisp as InternetExplorer;
_ieHtmlDocument2 = (IHTMLDocument2)explorer.Document;
_markupServices = (IMarkupServices)_ieHtmlDocument2;
_markupServices.CreateMarkupPointer(out _markupPointerBeginGlob); // No exception here
_workerThread = new Thread(WorkerThread);
_workerThread.IsBackground = true;
_workerThread.SetApartmentState(Thread.CurrentThread.GetApartmentState());
_workerThread.Start();
}
スレッド プロシージャは次のとおりです。
void WorkerThread()
{
_markupServices.CreateMarkupPointer(out _markupPointerBeginGlob); // Exception here!
}
EDIT: C++では、必要なものを達成するために次の関数を呼び出す必要があるようです:
CoMarshalInterThreadInterfaceInStream
CoGetInterfaceAndReleaseStream
EDIT2:
CoMarshalInterThreadInterfaceInStream / CoGetInterfaceAndReleaseStream を明示的に呼び出そうとしましたが、まだ結果がありません (マークアップ サービスを使用しようとすると、同じ例外がスローされます)