创建实现特定接口的ATL COM对象

时间:2010-02-03 09:43:52

标签: c++ com atl

我需要实现一个简单的ATL COM对象,该对象实现了一个特定的接口,我已经为其提供了.tlb文件和.idl文件。界面非常简单,只包含一个方法。我过去创建了许多ATL对象,但从来没有必须实现特定的接口。我需要做什么?我假设我在某处需要在我的新对象IDL中引用接口的IDL或TLB?

欢迎提出任何指示。

4 个答案:

答案 0 :(得分:4)

它比这里提出的其他答案要自动得多。所有样板代码都是由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;
    }

答案 1 :(得分:1)

编译.idl文件时,可以要求MIDL生成带有C ++接口定义的头文件 - 包含该头文件,并从特定接口的C ++等效项继承您的实现类。您可能还需要将C ++接口作为参数传递给ATL帮助程序基类,如IDispatchImpl

答案 2 :(得分:1)

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

#import "interface.tlb"

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

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

答案 3 :(得分:1)

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