从非主线程调用API导致缺少接口错误

时间:2017-06-03 23:30:11

标签: vb.net multithreading winapi com

我在我的应用程序中使用系统映像列表,如下所述。从主线程中调用它可以很好地工作,但是,如果我尝试从不同的线程执行此操作,则会导致错误,原因是我不太了解。

系统映像列表界面是:

 <ComImportAttribute(), GuidAttribute("46EB5926-582E-4017-9FDF-E8998DAA0950"), InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)> _
Private Interface iImageList
    <PreserveSig> _
    Function Add(ByVal hbmImage As IntPtr, ByVal hbmMask As IntPtr, ByRef pi As Integer) As Integer

'here comes the rest of standard functions for this interface

End Interface

Windows API定义是:

  <DllImport("shell32.dll", EntryPoint:="#727")> _
Private Shared Function SHGetImageList(ByVal iImageList As Integer, ByRef riid As Guid, ByRef ppv As IImageList) As Integer
End Function

最后,为了获得\创建图像列表,我正在执行以下操作:

Dim ID As New Guid("46EB5926-582E-4017-9FDF-E8998DAA0950")
Dim Intrf As iImageList=Nothing
Dim extraLargeIcons = &H2
Dim Ret As Integer = SHGetImageList(CInt(Fix(extraLargeIcons)), ID, Intrf )

如果从非主线程调用(仅从标准.Net后台工作者调用它),则最后一次调用创建列表会出现以下错误:

  

无法转换类型为&#39; System .__ ComObject&#39;的COM对象。到界面类型&#39; iImageList&#39;。此操作失败,因为QueryInterface调用COM组件上的接口与IID&#39; {46EB5926-582E-4017-9FDF-E8998DAA0950}&#39;由于以下错误而失败:不支持此类接口(HRESULT异常:0x80004002(E_NOINTERFACE))。

我想理解为什么会发生这种情况以及为什么iImageList接口在不同的线程中创建时突然不受支持(它可以从主线程完美地工作),并且如果有办法解决这个问题。

P.S。

我确实读过类似的问题,但我没有跨线程传递信息(我试图从一个线程创建和使用Imagelist),我也不明白如何解决这个问题。使用STA \ MTA-Thread属性什么都没有。最后,我应该说我对COM业务知之甚少。

0 个答案:

没有答案