我有一个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抓获。 不知道为什么。
任何人有一个想法,为什么这种失败在一个单独的线程?
谢谢你,哈罗德