我有一个访问COM对象的Windows窗体应用程序(编译为x86)。当代码在单独的线程上运行时,它在Windows 2003 x64上给出了以下错误 only :
在创建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()看起来像这样:
Dim q As New TeklogixQueue.Queue q.Object = ....'必须使用对象
我在不同的操作系统上尝试了相同的代码,结果如下:
如果我不在单独的线程上执行代码,那么它适用于所有平台。
我使用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}”,“SUCCESS”,“ “
“1:09:13.2617100 PM”,“IDocSend.exe”,“2704”,“RegQueryKey”,“HKCR \ Wow6432Node \ Interface {3CBD7297-27D8-11D6-B75D-00902761DFA4}”,“SUCCESS”,“查询:名称“
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}”,“SUCCESS”,“所需访问:读取“,”32位“
“1:10:01.6212927 PM”,“IDocSend.exe”,“4548”,“RegSetInfoKey”,“HKCR \ Wow6432Node \ Interface {3CBD7297-27D8-11D6-B75D-00902761DFA4}”,“成功“,”KeySetInformationClass:KeySetHandleTagsInformation,Length:0“,”32-bit“
“1:10:01.6213324 PM”,“IDocSend.exe”,“4548”,“RegQueryKey”,“HKCR \ Wow6432Node \ Interface {3CBD7297-27D8-11D6-B75D-00902761DFA4}”,“SUCCESS”,“查询:名称“,”32位“
请注意,在Windows 7上,有一个额外的“RegSetInfoKey”调用。
此外,如果我不在单独的线程上运行,则ProcessMonitor中没有捕获任何内容。不知道为什么。
任何人都知道为什么这会在一个单独的线程上失败?
谢谢, 哈罗德