Методы устранения ошибки, связанной с COM 0x80040154? - PullRequest
4 голосов
/ 15 июля 2011

Обновлено с более подробной информацией по отладке

Я использую проприетарный программный пакет, для которого у меня нет исходного кода, и он имеет интерфейс плагина на основе COM.У меня есть сборка .NET, которая видна в COM, что приложение успешно загружается на один компьютер, но не на другой.

Последние два дня я работаю над этой проблемой и чувствую, чтобесцельно бродить по ландшафту COM.В системе, которая не загружает мой плагин, когда я использую regasm /codebase /tlb, tlb генерируется и регистрируется успешно.

Когда я смотрю на единственный доступный мне файл журнала, он упоминает, что он может 't создать объект и возвращает код ошибки 0x80040154.

Я не могу понять, почему объект не может быть создан, и я надеюсь, что кто-то может предложить некоторые стратегии отладки.Вот что я уже безуспешно попробовал:

  • скопировать мою DLL и ее зависимости с рабочего компьютера на нерабочий компьютер
  • с установкой VS2010 на нерабочем компьютере(на рабочем компьютере он был установлен)
  • сравнивая результаты Dependency Walker для моей DLL и ее зависимостей на обоих компьютерах (они были идентичны)
  • использовал ListDLL.Обе системы загружают одинаковые библиотеки DLL
  • , запускают Process Monitor и фильтруют по CLSID для сборки при запуске regasm /codebase /tlb.Оба журнала были идентичны за исключением идентификаторов PID и меток даты, хотя работающая система создавала tlb и успешно регистрировалась, а нерабочая система регистрировала сборку, но не создавала tlb.
  • запустил Process Monitor и отфильтровал по CLSID для сборки при запуске приложения.У работающей системы было несколько записей в журнале, но у нерабочей системы их нет, что, как я полагаю, ожидается, так как tlb не был создан.
  • посмотрел OleView на работающей системе, в которой была сборкаперечислены с библиотекой типов под ним.В нерабочей системе была указана сборка, но не было библиотеки ассоциированных типов.См. Ниже.

Ниже приведены различия между записями сборки в OleView в рабочих и нерабочих системах:

  • В рабочей системе есть запись под сборкой, котораяЯ предполагаю, что соответствует библиотеке типов, которая была сгенерирована и зарегистрирована.Неработающая система не.
  • _Object в нерабочей системе имеет дополнительное значение в CLSID, которое называется InprocServer32[InprocServer32] = (gibberish here).
  • IConnectionPointContainer в нерабочей системе имеет ту же запись InprocServer32, что ивыше
  • то же самое для IDispatch, IManagedObject и IProvideClassInfo

Я просмотрю реестр, и, возможно, мне нужно удалить эти дополнительные записи и попытаться снова запустить regasm?

РЕДАКТИРОВАТЬ - Я решил проблему.Спасибо всем за вашу помощь.Оказывается, что файл отсутствовал в обеих системах, но по какой-то причине regasm работал на одной, а не на другой.Я подозреваю, что могло произойти изменение, когда зависимость была скопирована в папку, которая была в системном пути!Итак, я устроил "град Мэри", скопировал dll и выполнил регазм без каких-либо сообщений.И тогда приложение успешно загрузило плагин!

Ответы [ 3 ]

4 голосов
/ 16 июля 2011

Я предполагаю, что компонент, генерирующий ошибку "класс не зарегистрирован", принадлежит вам, верно?Другими словами, вы уверены из журнала, что он пытается создать ваш объект?Просто проверка работоспособности.

Возможно, вы захотите попробовать напрямую создать свой COM-объект, используя такой инструмент, как Oleview.exe.Прошло уже много времени с тех пор, как я использовал его, но я помню, что вы можете найти свой класс, а затем попытаться создать его экземпляр напрямую.захватить, какие записи реестра читаются в момент возникновения ошибки.Фильтруйте операции RegOpenKey (Операция - RegOpenKey) и ищите неудачные результаты (Результат не УСПЕХ).Это немного утомительно, но, сравнив контрольные трассы между двумя машинами, можно получить ответ.

Удачи!

Джон

3 голосов
/ 16 июля 2011

То, что он работает на вашем компьютере разработчика, а не на целевом компьютере, и что они идентичны, устраняет множество возможных режимов отказа.Остался только один: он работает на вашем компьютере разработчика, потому что вы позволяете IDE регистрировать сборку для вас.В этом случае вы используете Regasm.exe неправильно.Вы должны использовать его с параметром / codebase.Забудьте о параметре / tlb, который предназначен для компиляторов.

С / codebase сборка регистрируется в каталоге, в котором она находится.Вы получите предупреждение от Regasm, сообщающее, что вы собираетесь войти в DLL Hell.В этом случае вы ничего не можете с этим поделать, так что игнорируйте это предупреждение.Без / codebase вы должны поместить сборку в GAC с помощью gacutil.exe, чтобы можно было найти сборку.

Конечная стратегия устранения неполадок заключается в использовании утилиты SysInternals ProcMon и просмотре записей трассировки, показывающих поиск приложениядля компонента COM.Вы увидите, что вы нажимаете клавишу HKLM\Software\Classes\CLSID\{guid} для регистрации информации.Сравните с тем, что вы видите, используя Regedit.exe.Если вы видите, что Wow6432Node ищется, значит, вы работаете в 64-битной операционной системе и должны использовать 32-битную версию Regasm.exe для регистрации сборки.

2 голосов
/ 15 июля 2011

Две системы имеют разные архитектуры ЦП? Если это так, то возможно, что ваш COM-объект был построен как процессор X86 явно вместо AnyCPU, в этом случае вам может потребоваться создать клиентское приложение как X86, чтобы избежать проблем совместимости в системах X64.

...