如何在 VS C++ 中使用 .tlb 类型创建接口方法?

Posted

技术标签:

【中文标题】如何在 VS C++ 中使用 .tlb 类型创建接口方法?【英文标题】:How do I create interface methods using .tlb types in VS C++? 【发布时间】:2011-01-29 05:42:22 【问题描述】:

背景:

    .TLB 文件包含用语言“X”编写的接口。我没有 .h、.idl、.tlh 或任何其他头文件 - 只有 .TLB 文件。语言“X”不导出兼容的 .h、.idl 等。 我使用 VS 向导将 ATL 简单对象添加到我的 ATL 项目中。

我想向我的简单 ATL 对象的接口添加一个方法,该对象使用 .TLB 定义的类型之一作为参数。

// Something like the following in the .idl file:
interface ISomeInterface : IUnknown 
   HRESULT SomeMethod([in] ITypeFromTLB* aVal); // ITypeFromTLB declared in .TLB file.
;

我该怎么做?我希望有一个向导,或者 .idl 接口声明中的一行可以引入 .tlb 信息。 midl 的包含(无 .tlb)、导入(无 tlb)和 importlib(仅限库)似乎没有提供解决方案(我需要代理/存根工作,所以我不能把这个在库声明中使用 importlib 命令)。

【问题讨论】:

【参考方案1】:

在 cpp/h 中使用 #import 将 TLB 接口引入您的命名空间。

【讨论】:

这在 midl 编译器中不可用。 这是 C/C++ 编译器的指令,不是 MIDL 编译器的指令。把它放在你的#include之后 我需要在我的 IDL 文件中引入信息,以便我可以声明一个新接口。 #import 只会将信息带入我的 .h 和 .cpp 文件中。 使用 importlib 时哪个接口代理/存根不起作用? importlib 只能在内部库声明中使用。为了使代理/存根工作,ISomeInterface 声明必须在库声明之前。 importlib 由于其功能的限制而无法使用【参考方案2】:

在 Visual Studio 命令行上执行 oleview。然后 File -> View Type Lib,给它你的 foo.tlb 的完整路径。现在在 ITypeLib Viewer 中执行 File -> Save As .. 你可以从那里导出所有 3 个(.h、.idl、.c)。

【讨论】:

请注意,您需要以管理员身份运行 oleview 才能正常工作

以上是关于如何在 VS C++ 中使用 .tlb 类型创建接口方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何在命令行上从 COM exe 中提取 TypeLib

公共继承和 tlb 文件

我用VS2010的C++导入ADO导入不了,提示无法打开源文件msado15.tlh

如何在VS2010中运行编译C和C++?

如何使用 C++ 封装的 COM 接口部署 C# 库?

如何在 VS 2012 Express 中使用 C++ 自动化 Outlook?