我有一个访问 COM 对象的 Windows 窗体应用程序(编译为 x86)。它给了我以下错误,only在 Windows 2003 x64 上,当代码在单独的线程上运行时:
创建 IDoc 期间出现异常:无法将类型“PTISG.COM.TeklogixQueue.QueueClass”的 COM 对象强制转换为接口类型“PTISG.COM.TeklogixQueue._Queue”。此操作失败,因为对 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 x64。作品。
- Windows 2008 x64。作品。
- Windows 2003 R2 服务器标准 x64。
失败了。
如果我不在单独的线程上执行代码,那么它可以在所有平台上运行。
我使用 ProcessMonitor 捕获该接口 ID 的注册表读取,以下是 Windows 2003 与 Windows 7 之间的一个区别:
Windows 2003:
“1:09:13.2616131 PM”,“IDocSend.exe”,“2704”,“RegOpenKey”,“HKCU\Software\Classes\Wow6432Node\Interface{3CBD7297-27D8-11D6-B75D-00902761DFA4}”,“名称未找到“,”“
"1:09:13.2616360 PM","IDocSend.exe","2704","RegOpenKey","HKCR\Wow6432Node\Interface{3CBD7297-27D8-11D6-B75D-00902761DFA4}","成功",""
"1:09:13.2617100 PM","IDocSend.exe","2704","RegQueryKey","HKCR\Wow6432Node\Interface{3CBD7297-27D8-11D6-B75D-00902761DFA4}","成功","查询:名称”
Windows 7的:
“1:10:01.6212010 PM”、“IDocSend.exe”、“4548”、“RegOpenKey”、“HKCU\Software\Classes\Wow6432Node\Interface{3CBD7297-27D8-11D6-B75D-00902761DFA4}”、“名称未找到","所需的访问权限:读取","32 位"
"1:10:01.6212518 PM","IDocSend.exe","4548","RegOpenKey","HKCR\Wow6432Node\Interface{3CBD7297-27D8-11D6-B75D-00902761DFA4}","成功","所需的访问权限:读取","32位"
“1:10:01.6212927 PM”、“IDocSend.exe”、“4548”、“RegSetInfoKey”、“HKCR\Wow6432Node\Interface{3CBD7297-27D8-11D6-B75D-00902761DFA4}”、“成功”、“KeySetInformationClass:KeySetHandleTagsInformation ,长度:0","32位"
"1:10:01.6213324 PM","IDocSend.exe","4548","RegQueryKey","HKCR\Wow6432Node\Interface{3CBD7297-27D8-11D6-B75D-00902761DFA4}","成功","查询:名称","32位"
请注意,在 Windows 7 上,有一个额外的“RegSetInfoKey”调用。
另外,如果我不在单独的线程上运行,则 ProcessMonitor 中不会捕获任何内容。不知道为什么。
任何人都知道为什么这在单独的线程上失败?
谢谢,
哈罗德