gpt4 book ai didi

c# - 在不同线程中使用mshtml接口(interface)

转载 作者:太空宇宙 更新时间:2023-11-03 13:48:42 35 4
gpt4 key购买 nike

我有一个用 C# 编写的 BHO。初始化在主线程的 DocumentComplete 事件处理程序中执行,然后我启动单独的线程并想在该线程中使用 IMarkupServices 但收到以下错误:

System.InvalidCastException: Unable to cast COM object of type 'mshtml.HTMLDocumentClass' to interface type 'mshtml.IMarkupServices'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{3050F4A0-98B5-11CF-BB82-00AA00BDCE0B}' failed due to the following error: No such interface supported (Exception from 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!
}

编辑:似乎在 C++ 中有必要调用以下函数来实现我所需要的:

CoMarshalInterThreadInterfaceInStream
CoGetInterfaceAndReleaseStream

编辑 2:

尝试显式调用 CoMarshalInterThreadInterfaceInStream/CoGetInterfaceAndReleaseStream 但仍然没有结果(尝试使用标记服务时抛出相同的异常)

最佳答案

为了将 IMarkupServices 传递给工作线程,接口(interface)首先需要被实现并可用,而且它还应该是可编码的。您似乎对后者不满意:接口(interface)没有对类型库或自定义代理/ stub 类的引用。它也不能提供自动代理/ stub 对。因此,它不能穿过公寓边界。

更新。这里的重点是,如果您可以将接口(interface)传递给另一个线程,对象本身将指示底层编码(marshal)处理模式(取决于单元类型、对象的IMarshal 实现可用性) ,是否可以直接从后台线程访问对象,或者此访问将被序列化到原始线程中。在后一种情况下,编码到工作线程可能会使 UI 线程保持响应,但由于编码费用增加,整个处理过程可能总体上变慢。在您的情况下,您无法首先进行编码。

基本上,您只能选择在原始线程中使用它。在 native 域中,您还可以尝试违反 COM 准则并将原始指针传递到后台线程并从那里使用它。这不能保证有效,我也不建议这样做,但取决于对象本身,它有时效果很好。在托管代码中,更不推荐使用此技巧(如果可能的话)。

关于c# - 在不同线程中使用mshtml接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14385637/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com