C++/CLR 类中的 CComPtr 成员

Member CComPtr in a C++/CLR class

本文关键字:CComPtr 成员 CLR C++      更新时间:2023-10-16

我正在编写一个 C++/CLI 类,该类需要在其生命周期内保持CComPtr,例如

public ref class MyClass
{
public:
    MyClass()
    {
        CComPtr<ISomeType> pSomeType;
        // init someType;
        m_pSomeType = pSomeType;
    }
private:
    CComPtr<ISomeType> m_pSomeType;
    void DoSomething()
    {
        m_pSomeType->DoSomething();
    }
}

但是这不能编译,因为不支持混合类型 - 解决方案是使用 AutoPtr . 我仍然需要参考计数,所以这就是我想出的。

public ref class MyClass
{
public:
    MyClass()
    {
        CComPtr<ISomeType> pSomeType;
        // init someType;
        m_pSomeType = new CComPtr<ISomeType>(pSomeType);
    }
private:
    AutoPtr<CComPtr<ISomeType>> m_pSomeType;
    void DoSomething()
    {
        CComPtr<ISomeType> pSomeType = *m_pSomeType.GetPointer();
        pSomeType->DoSomething();
    }
}

这对我来说看起来很讨厌,我也怀疑它在某种程度上是错误的(我来自 C# 背景,所以我在学习的过程中学到了很多东西)。

如何将CComPtr"存储"为 C++/CLR 类的成员?

我做了一个智能指针,可能会对你有所帮助。 它不能用于直接管理 COM 指针,但可用于在托管类中保存 CComPtr。

  • C++/CLI 的scoped_ptr(确保托管对象正确释放拥有的本机对象)

如果您选择使用它,请遵守许可要求(不禁止商业用途,但您必须注明出处)。

另外,你可以写

(*m_pSomeType)->DoSomething();

而不是复制CComPtr(必须更新引用计数)。

除此之外,我会在构造函数中使用 ctor-initializer-list 而不是赋值。

MyClass()
    : m_pSomeType(new CComPtr<ISomeType>)
{
}

如果要分别编译托管和非托管代码,则此处有一个链接。

使用它,您可以保留两者的味道。