【问题标题】:Creating an ATL COM object that implements a specific interface创建实现特定接口的 ATL COM 对象
【发布时间】:2011-01-12 13:21:12
【问题描述】:

我需要实现一个简单的 ATL COM 对象,该对象实现一个特定的接口,我已经获得了一个 .tlb 文件和一个 .idl 文件。接口非常简单,只包含一个方法。我过去创建了许多 ATL 对象,但从来没有一个必须实现特定接口的对象。我需要什么来实现这一目标?我假设我需要在某个地方的新对象 IDL 中以某种方式引用接口的 IDL 或 TLB?

欢迎指点。

【问题讨论】:

    标签: c++ com atl


    【解决方案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

    【讨论】:

    【解决方案3】:

    如果你有interface.tlb文件,你可以使用

    #import "interface.tlb"
    

    要将其包含在 .cpp 文件中,编译器会将 .tlb 转换为 C++ 样式的接口声明。它会即时创建一个名为 interface.tlh 的文件,然后自动创建#includes

    然后您使用通常的 C++ 样式代码编写一个实现生成的 .tlh 文件中的接口的类。

    【讨论】:

      【解决方案4】:

      我看不到如何将我的问题添加到已接受的答案中,但我尝试按照他的示例中给出的说明进行操作,但在选择项目收音机时,我无法在“实施界面”对话框中列出 IJim 界面按钮即使在我编译 IDL 文件后也没有列出接口,而是选择导航到类型库也没有帮助。

      【讨论】:

      • 我已经找到答案,类视图不允许您实现自己的界面。如果改为选择不同的 ATL 对象并选择“实现接口”,我可以在接口列表中看到 IJim
      猜你喜欢
      • 2021-12-27
      • 2010-12-17
      • 2013-09-19
      • 2016-08-12
      • 2012-12-20
      • 1970-01-01
      • 2018-04-25
      • 2012-11-03
      相关资源
      最近更新 更多