我正在编写一个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保留在托管类中。

  • scoped_ptr for C++/CLI (ensure managed object properly frees owned native object)

  • 如果选择使用许可证,请遵守许可证要求(不禁止商业使用,但必须提供信用)。

    另外,你可以写
    (*m_pSomeType)->DoSomething();
    

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

    除此之外,我将使用ctor-initializer-list而不是在构造函数中进行赋值。
    MyClass()
        : m_pSomeType(new CComPtr<ISomeType>)
    {
    }
    

    关于c++ - C++/CLR类中的成员CComPtr,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11832010/

    10-11 03:57