【发布时间】:2011-01-12 13:21:12
【问题描述】:
我需要实现一个简单的 ATL COM 对象,该对象实现一个特定的接口,我已经获得了一个 .tlb 文件和一个 .idl 文件。接口非常简单,只包含一个方法。我过去创建了许多 ATL 对象,但从来没有一个必须实现特定接口的对象。我需要什么来实现这一目标?我假设我需要在某个地方的新对象 IDL 中以某种方式引用接口的 IDL 或 TLB?
欢迎指点。
【问题讨论】:
我需要实现一个简单的 ATL COM 对象,该对象实现一个特定的接口,我已经获得了一个 .tlb 文件和一个 .idl 文件。接口非常简单,只包含一个方法。我过去创建了许多 ATL 对象,但从来没有一个必须实现特定接口的对象。我需要什么来实现这一目标?我假设我需要在某个地方的新对象 IDL 中以某种方式引用接口的 IDL 或 TLB?
欢迎指点。
【问题讨论】:
它比这里的其他答案建议的要自动得多。所有样板代码都是由 Visual Studio 为您编写的。
你很幸运你有 .idl,我认为这是迄今为止最方便的。
您可以将 .idl 文件的内容粘贴到 ATL COM 项目的现有 .idl 文件中,这样您就可以访问其中的声明。例如,可以将这样的内容粘贴到 IDL 文件中:
[
object,
uuid(ecaac0b8-08e6-45e8-a075-c6349bc2d0ac),
dual,
nonextensible,
helpstring("IJim Interface"),
pointer_default(unique)
]
interface IJim : IDispatch
{
[id(1), helpstring("method SpliceMainbrace")] HRESULT SpliceMainbrace(BSTR* avast);
};
然后在班级视图中,右键单击您的班级并选择Add | Implement Interface。
请注意,在此对话框中,您实际上可以浏览 .tlb 文件,但我认为最好为这些内容提供纯文本源代码,以便进行版本控制等。
从列表中选择IJim,按下>按钮将其添加到要实现的列表中。按完成。
Visual Studio 会将它添加到您的课程中(以及其他一堆废话以使其正常工作):
// IJim Methods
public:
STDMETHOD(SpliceMainbrace)(BSTR * avast)
{
// Add your function implementation here.
return E_NOTIMPL;
}
【讨论】:
当您编译 .idl 文件时,您可以要求 MIDL 生成带有 C++ 接口定义的头文件 - 包括该头文件并从特定接口的 C++ 等效项继承您的实现类。您可能还需要将 C++ 接口作为参数传递给 ATL 帮助器基类,例如 IDispatchImpl。
【讨论】:
如果你有interface.tlb文件,你可以使用
#import "interface.tlb"
要将其包含在 .cpp 文件中,编译器会将 .tlb 转换为 C++ 样式的接口声明。它会即时创建一个名为 interface.tlh 的文件,然后自动创建#includes。
然后您使用通常的 C++ 样式代码编写一个实现生成的 .tlh 文件中的接口的类。
【讨论】:
我看不到如何将我的问题添加到已接受的答案中,但我尝试按照他的示例中给出的说明进行操作,但在选择项目收音机时,我无法在“实施界面”对话框中列出 IJim 界面按钮即使在我编译 IDL 文件后也没有列出接口,而是选择导航到类型库也没有帮助。
【讨论】: