TYPE_E_CANTLOADLIBRARY при использовании объекта COM в отдельном потоке только в Windows 2003 x64 - PullRequest
1 голос
/ 05 февраля 2010

У меня есть приложение 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 ничего не записывается. Не знаю почему.

У кого-нибудь есть идея, почему это не удается в отдельном потоке?

Спасибо, Гарольд

...