代码之家  ›  专栏  ›  技术社区  ›  Justin

C++/CLR类中的成员CComPtr

  •  2
  • Justin  · 技术社区  · 14 年前

    我正在编写一个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类的成员?

    2 回复  |  直到 14 年前
        1
  •  2
  •   Community Mohan Dere    9 年前

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

    如果您选择使用它,请尊重许可证要求(商业用途不被禁止,但您必须给予信用)。

    此外,你可以写

    (*m_pSomeType)->DoSomething();
    

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

    除此之外,我会使用 ctor初始值设定项列表 而不是构造函数中的赋值。

    MyClass()
        : m_pSomeType(new CComPtr<ISomeType>)
    {
    }
    
        2
  •  0
  •   perilbrain    14 年前

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

    用这个可以保持两者的味道。