我在我的应用程序中使用系统映像列表,如下所述。从主线程中调用它可以很好地工作,但是,如果我尝试从不同的线程执行此操作,则会导致错误,原因是我不太了解。
系统映像列表界面是:
<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业务知之甚少。