创建实现特定接口的 ATL COM 对象
Posted
技术标签:
【中文标题】创建实现特定接口的 ATL COM 对象【英文标题】:Creating an ATL COM object that implements a specific interface 【发布时间】:2011-01-12 13:21:12 【问题描述】:我需要实现一个简单的 ATL COM 对象,该对象实现一个特定的接口,我已经获得了一个 .tlb 文件和一个 .idl 文件。接口非常简单,只包含一个方法。我过去创建了许多 ATL 对象,但从来没有一个必须实现特定接口的对象。我需要什么来实现这一目标?我假设我需要在某个地方的新对象 IDL 中以某种方式引用接口的 IDL 或 TLB?
欢迎指点。
【问题讨论】:
【参考方案1】:它比这里的其他答案建议的要自动得多。所有样板代码都是由 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;
【讨论】:
帮助字符串与 sn-p 中的接口名称不匹配。 @sharptooth - 好点,不希望人们把 IFred 和 IJim 搞混,所以我修好了。【参考方案2】:当您编译 .idl 文件时,您可以要求 MIDL 生成带有 C++ 接口定义的头文件 - 包括该头文件并从特定接口的 C++ 等效项继承您的实现类。您可能还需要将 C++ 接口作为参数传递给 ATL 帮助器基类,例如 IDispatchImpl
。
【讨论】:
看这个关于如何继承的问题:***.com/questions/1729834/…【参考方案3】:如果你有interface.tlb文件,你可以使用
#import "interface.tlb"
要将其包含在 .cpp 文件中,编译器会将 .tlb 转换为 C++ 样式的接口声明。它会即时创建一个名为 interface.tlh 的文件,然后自动创建#includes
。
然后您使用通常的 C++ 样式代码编写一个实现生成的 .tlh 文件中的接口的类。
【讨论】:
【参考方案4】:我看不到如何将我的问题添加到已接受的答案中,但我尝试按照他的示例中给出的说明进行操作,但在选择项目收音机时,我无法在“实施界面”对话框中列出 IJim 界面按钮即使在我编译 IDL 文件后也没有列出接口,而是选择导航到类型库也没有帮助。
【讨论】:
我已经找到答案,类视图不允许您实现自己的界面。如果改为选择不同的 ATL 对象并选择“实现接口”,我可以在接口列表中看到 IJim以上是关于创建实现特定接口的 ATL COM 对象的主要内容,如果未能解决你的问题,请参考以下文章