创建实现特定接口的 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 对象的主要内容,如果未能解决你的问题,请参考以下文章

Visual C++:接口的 ATL 实现

如何创建两个从另一个派生的 ATL 接口?

在 MFC+ATL EXE 中使用带有未注册接口的 IDispatchImpl

将实现ATL接口的VBA类传递给ATL方法

ATL“实现界面向导”

ATL/COM:MIDL 编译器不输出分配接口的 UUID