【问题标题】:Is it possible to implment a COM interface without creating a custom interface?是否可以在不创建自定义接口的情况下实现 COM 接口?
【发布时间】:2011-01-21 00:28:15
【问题描述】:

我正在学习 c++,我正在努力更好地理解它。我正在阅读有关如何使用 xml lite 的 msdn 文档。它说我必须使用一个实现 IStream 接口的类。它说要声明和实例化我的扩展 Istream 的类,并在声明变量时使用 CComPtr。然后它向我展示了以下内容。

CComPtr<IStream> pFileStream;
CComPtr<IXmlReader> pReader;

我有点困惑。如果使用 CComptr 来拉取 xml。为什么我要延长。为什么不让 CComptr 已经实现 IStream 并调用 CComptr。还是 CComptr 已经有 IStream 并且 istream 有效的唯一方法是像上面一样扩展???

【问题讨论】:

    标签: c++ visual-c++ com


    【解决方案1】:

    如果使用 CComptr 来拉取 xml。为什么我要延长。为什么不让 CComptr 已经实现 IStream 并调用 CComptr?
    IStream 是一个接口——说“我想要一些实现这个接口的类”并不能说明你想要如何实际获取数据。 CComPtr 只是一个指向实现接口的 coclass 的指针——它本身并不实际实现任何接口。

    是否可以在不创建自定义接口的情况下实现 COM 接口?
    我在这里不是 100% 肯定的,但我不认为你需要实现一个接口。但是,您确实需要在 coclass 中实现接口本身。

    【讨论】:

    • 你是对的。事实上这很常见。例如,所有的 Shell 扩展都实现了 Explorer.exe 使用的 COM 接口。很少添加自定义接口; Explorer 不会使用它们,因此它们仅供内部使用。
    • 好的,我习惯于类实现接口的语言。你可以打电话给班级。你不必做类。我的印象是,在 c++ 中,为了让编译器注意到接口,您必须像 class 一样调用它。如果我错了,请纠正我。
    • @numerical25 这不是C++语言的问题。是COM的。 COM 不是 C++ 的一部分。这是二进制级别的 Microsoft 约定。您也可以在 C 中实现 COM 对象。 en.wikipedia.org/wiki/Component_Object_Model
    • @numerical25:换一种说法——你把 C++ 类和 COM CoClass 混为一谈了。两者完全无关。 CoClass 实现了一系列接口,并且可以用任何 COM 支持的语言编写。甚至像 C 这样没有类或对象概念的语言。
    【解决方案2】:

    CComPtr&lt;&gt; 是用于自动管理对象生命周期的智能指针。它或多或少与Interface* 相同,其中Interface 是CComPtr 模板参数(在此示例中为IStream*IXmlReader*),但提供了一些不影响对象指向方式的附加功能发挥作用。

    所以CComPtr&lt;IStream&gt; 内部有一个IStream* 和一个重载的operator -&gt;(),它将调用重定向到IStream*。这同样适用于CComPtr&lt;IXmlReader&gt; - 它内部有IXmlReader*

    【讨论】:

      【解决方案3】:

      这个问题需要一个复杂的答案。

      COM 接口不是 C++ 语言的一部分。它们可以使用不同的语言来实现。 C++ 只是其中之一。

      每个 COM 接口都继承自 IUnknown 接口,该接口实现 QueryInterface() AddRef() 和 Release() 方法

      QueryInterface() 必须用于请求 COM 对象接口。由于每个 COM 接口都继承自 IUnknown,因此可以在任何接口上调用它。

      必须调用 AddRef() 和 Release() 来管理对象的生命周期。

      CComPtr 是一个模板类,在 Microsoft ATL 库中实现,用于包装任何 COM 接口,在需要时自动调用 QueryInterface()、AddRef() 和 Release()。

      在您的示例中,CComPtr pFileStream 可用于访问对象的 IStream 接口成员。

      http://msdn.microsoft.com/en-us/library/ezzw7k98%28VS.80%29.aspx

      【讨论】:

        猜你喜欢
        • 2021-06-12
        • 2010-09-13
        • 2011-01-12
        • 2016-05-08
        • 2014-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多