5

类型库声明应用程序或动态链接库 (DLL) 公开的类、接口、常量和过程。类型库通常是程序文件中的资源;它也可以是扩展名为 .tlb 或 .olb 的独立二进制文件。

那么是否有可能某些 DLL 仍然公开接口而不被声明为 TypeLib。

实际上我正在尝试从 oleview 打开一个 dll 并显示错误消息“错误加载类型库”。

根据我的理解,如果我们有从 DLL 暴露的接口,那么它应该由 oleview 打开,否则它不能有暴露的接口或函数。

我们有 dll 暴露接口但仍然无法被 Oleview 查看的任何可能性。

4

4 回答 4

3

可以创建匿名 COM 组件以及仅支持 IUnknown 和私有接口的组件。没有严格要求组件的所有信息都应在类型库中定义。对于那些试图集成组件并为 COM 提供布局和其他信息的人来说,类型库只是让事情变得更容易。

另请注意,有时与脚本兼容的组件(IDispatch、IDispatchEx)仅支持运行时信息,因此这些通常会附带一个准系统类型库或根本没有。但是,对于公开这些接口的组件,您可以通过这些接口询问它们以获取信息。

最后,OleView 使用 ITypeLib / ITypeInfo 来检查类型信息。并非所有的 COM 库都会提供实现,有些可能会选择将信息存储在单独的位置。

于 2009-07-14T14:24:17.633 回答
1

...是否有可能某些 DLL 仍然公开接口而不被声明为 TypeLib。

是的。您可以拥有一个没有 tlb 的 COM DLL(例如,它不是 VC++ 在 ATL 项目中默认为您制造的)。

我们有 dll 暴露接口但仍然无法被 Oleview 查看的任何可能性。

只是一个疯狂的猜测(不确定建议是否正确),但您的 DLL 是否可以包含一个 tlb,该 tlb 引用了它无法找到的外部 TLB?

此外,您的 TLB 可能包含 OLEView 无法消化的不受支持的(可能是自定义的)类型。它纯粹是一种双接口的 DLL 吗?

于 2009-06-08T10:05:26.453 回答
1

首先,您应该使用 File->View Typelib 打开库,而不是按工具栏按钮。这是一个典型的错误。

然后,您可以轻松地拥有一个在资源中没有类型库的进程内 COM 服务器,但后期绑定和默认编组将不起作用,否则它将正常运行。当您实现一组外部定义的接口(例如 IFilter)并确定没有人不会对您的 COM 服务器使用后期绑定或编组时,通常会这样做。

于 2009-06-08T10:17:20.063 回答
0

OleView 可能无法查看类型库 - 这并不是世界上最稳定的软件。这并不是说没有类型库,或者这样定义的接口将无法使用。

于 2009-06-08T10:05:01.587 回答