Oleview ошибка "ошибка загрузки библиотеки типов"? - PullRequest
4 голосов
/ 08 июня 2009

Библиотека типов объявляет классы, интерфейсы, константы и процедуры, предоставляемые приложением или динамически подключаемой библиотекой (DLL). Библиотека типов обычно является ресурсом в программном файле; это также может быть отдельный двоичный файл с расширением .tlb или .olb.

Так что возможно, что некоторые DLL все еще предоставляют интерфейсы, не будучи объявленными как TypeLib.

На самом деле я пытаюсь открыть DLL из oleview и показывает сообщение об ошибке «Ошибка загрузки библиотеки типов».

Согласно моему пониманию, если у нас есть интерфейсы, предоставляемые из DLL, тогда он должен быть открыт с помощью oleview, иначе он не может иметь открытых интерфейсов или функций.

Любая возможность того, что у нас есть dll, выставляющие интерфейсы, и все еще не может быть просмотрена Oleview.

Ответы [ 4 ]

3 голосов
/ 14 июля 2009

Можно создавать анонимные компоненты COM, а также компоненты, которые поддерживают только IUnknown и частные интерфейсы. Не существует строгого требования, чтобы вся информация для компонента была определена в библиотеке типов. Библиотека типов просто облегчает задачу тем, кто пытается интегрировать компонент, и предоставляет макет и другую информацию для COM.

Также обратите внимание, что иногда совместимые со сценариями компоненты (IDispatch, IDispatchEx) поддерживают только информацию времени выполнения, поэтому они обычно поставляются с библиотекой пустых типов или вообще без нее. Но с компонентами, которые предоставляют эти интерфейсы, вы можете запрашивать их через эти интерфейсы для получения информации.

Наконец, OleView использует ITypeLib / ITypeInfo для проверки информации о типе. Не все COM-библиотеки предоставляют реализацию, и некоторые могут хранить информацию в отдельном месте.

1 голос
/ 08 июня 2009

... возможно, что какая-то DLL все еще выставлять интерфейсы не будучи как объявлен как TypeLib.

Да. У вас может быть COM DLL без tlb (хотя, к примеру, это не то, что VC ++ производит для вас по умолчанию в проектах ATL).

Любая возможность, что у нас есть DLL разоблачение интерфейсов и до сих пор не может быть просмотрена Oleview.

Просто дикая догадка (не уверен, что это даже правильно предложить), но может ли ваша DLL содержать tlb, который ссылается на внешний TLB, который он не может найти?

Кроме того, ваш TLB может содержать неподдерживаемые (возможно, пользовательские) типы, которые OLEView просто не может переварить. Это чисто DLL-интерфейс с двойным интерфейсом?

1 голос
/ 08 июня 2009

Во-первых, вы должны открыть библиотеку с помощью File-> View Typelib, а не нажатием кнопки на панели инструментов. Это типичная ошибка.

Тогда вы можете легко иметь внутрипроцессный COM-сервер без библиотеки типов в ресурсах, но позднее связывание и маршалинг по умолчанию для него не подойдут, иначе он будет работать нормально. Обычно это происходит, когда вы реализуете набор внешних интерфейсов (например, IFilter) и точно знаете, что никто не будет использовать ни позднюю привязку, ни маршалинг с вашим COM-сервером.

0 голосов
/ 08 июня 2009

Возможно, что библиотека типов может быть недоступна для просмотра OleView - это не совсем стабильная программа в мире. Это не означает, что нет библиотеки типов или что определенные таким образом интерфейсы были бы непригодны для использования.

...