TYPE_E_CANTLOADLIBRARY只能在Windows 2003 x64的一个单独的线程使

2019-09-29 01:09发布

我有一个Windows窗体应用程序(编译为x86)的访问COM对象。 它给了我下面的错误, 只能在Windows 2003 x64上,当代码在一个单独的线程上运行:

无法转换类型的COM对象“PTISG.COM.TeklogixQueue.QueueClass”到接口类型“PTISG.COM.TeklogixQueue._Queue”:创建的IDoc期间除外。 此操作失败的原因是对IID“{3CBD7297-27D8-11D6-B75D-00902761DFA4}”的界面处的COM组件调用QueryInterface失败,因为以下错误:错误加载类型库/ DLL。 (从HRESULT异常:0x80029C4A(TYPE_E_CANTLOADLIBRARY))

而代码如下所示:

Private Sub Button3_Click(...)
    If _separateThreadCheckBox.Checked Then
        Dim t As Thread
        t = New Thread(AddressOf Me.CreateQueue)
        t.Start()
    Else
        Me.CreateQueue()
    End If
End Sub

和createQueue方法()看起来是这样的:

昏暗的q作为新TeklogixQueue.Queue q.Object = ....“已经使用对象

我试过在不同的操作系统相同的代码和这里的结果:

  • Windows 7的64位。 作品。
  • Windows 2008的64位。 作品。
  • 的Windows 2003 R2服务器x64标准。 失败。

如果我没有在一个单独的线程中执行的代码,那么它适用于所有平台。

我用的ProcessMonitor捕捉到注册表中读取该接口ID,这里是与Windows 7中的Windows 2003之间的一个区别:

Windows 2003中:

“1:09:13.2616131 PM”, “IDocSend.exe”, “2704”, “RegOpenKey”, “HKCU \ Software \ Classes下\ Wow6432Node \ {接口3CBD7297-27D8-11D6-B75D-00902761DFA4}”,“找不到名称”, “”

“1:09:13.2616360 PM”, “IDocSend.exe”, “2704”, “RegOpenKey”, “HKCR \ Wow6432Node \界面{3CBD7297-27D8-11D6-B75D-00902761DFA4}”, “成功”, “”

“1:09:13.2617100 PM”, “IDocSend.exe”, “2704”, “RegQueryKey”, “HKCR \ Wow6432Node \界面{3CBD7297-27D8-11D6-B75D-00902761DFA4}”, “成功”,“查询:名称“

Windows 7的:

“1:10:01.6212010 PM”, “IDocSend.exe”, “4548”, “RegOpenKey”, “HKCU \ Software \ Classes下\ Wow6432Node \ {接口3CBD7297-27D8-11D6-B75D-00902761DFA4}”,“找不到名称”,‘希望的访问:读’,‘32位’

“1:10:01.6212518 PM”, “IDocSend.exe”, “4548”, “RegOpenKey”, “HKCR \ Wow6432Node \界面{3CBD7297-27D8-11D6-B75D-00902761DFA4}”, “成功”,“所需的访问:读”,‘32位’

“1:10:01.6212927 PM”, “IDocSend.exe”, “4548”, “RegSetInfoKey”, “HKCR \ Wow6432Node \界面{3CBD7297-27D8-11D6-B75D-00902761DFA4}”, “成功”,“KeySetInformationClass:KeySetHandleTagsInformation ,长度:0" , “32位”

“1:10:01.6213324 PM”, “IDocSend.exe”, “4548”, “RegQueryKey”, “HKCR \ Wow6432Node \界面{3CBD7297-27D8-11D6-B75D-00902761DFA4}”, “成功”,“查询:名称”,‘32位’

注意:在Windows 7上,有一个额外的“RegSetInfoKey”电话。

另外,如果我没有在一个单独的线程中运行,没有什么在的ProcessMonitor抓获。 不知道为什么。

任何人有一个想法,为什么这种失败在一个单独的线程?

谢谢你,哈罗德

文章来源: TYPE_E_CANTLOADLIBRARY when using a COM object on a separate thread on Windows 2003 x64 only