У меня есть приложение Windows Forms (скомпилированное как x86) для доступа к COM-объекту. Это дает мне следующую ошибку, только в Windows 2003 x64, когда код запускается в отдельном потоке:
Исключительная ситуация при создании IDoc: невозможно преобразовать COM-объект типа PTISG.COM.TeklogixQueue.QueueClass в интерфейс типа PTISG.COM.TeklogixQueue._Queue. Эта операция завершилась неудачно, поскольку вызов QueryInterface в компоненте COM для интерфейса с IID '{3CBD7297-27D8-11D6-B75D-00902761DFA4}' завершился ошибкой из-за следующей ошибки: Ошибка загрузки библиотеки типов / 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 = .... 'Должен использовать объект
Я пробовал один и тот же код на разных ОС, и вот результат:
- Windows 7 x64. Работает.
- Windows 2008 x64. Работает.
- Windows 2003 R2 Server Standard x64.
Не удается.
Если я не выполню код в отдельном потоке, он будет работать на всех платформах.
Я использовал ProcessMonitor для захвата считываний реестра для этого идентификатора интерфейса, и вот одно отличие 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, Length: 0 "," 32-bit "
«1:10: 01.6213324 PM», «IDocSend.exe», «4548», «RegQueryKey», «HKCR \ Wow6432Node \ Interface {3CBD7297-27D8-11D6-B75D-00902761DFA4}», «УСПЕХ», « Запрос: Имя "," 32-разрядный "
Обратите внимание, что в Windows 7 есть дополнительный вызов RegSetInfoKey.
Кроме того, если я не запускаю отдельный поток, в ProcessMonitor ничего не записывается. Не знаю почему.
У кого-нибудь есть идея, почему это не удается в отдельном потоке?
Спасибо,
Гарольд