2012-08-06 47 views
1

我正在编写一个C++/CLI类,它需要在其生命周期的持续时间内保留到CComPtr,例如,在C++/CLR类中的成员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类的成员?

回答

1

我制作了一个智能指针,可以帮助你。它不能用于直接管理COM指针,但它可用于在托管类中保存CComPtr。

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

此外,你可以写

(*m_pSomeType)->DoSomething(); 

,而不是复制CComPtr(其中有更新引用计数)。

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

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

这看起来非常类似于我已经使用的'AutoPtr'类,除非这提供了我没有看到的一些优点? – Justin 2012-08-06 16:46:04

+0

@Justin:和'std :: unique_ptr'和'boost :: scoped_ptr'比'std :: auto_ptr'好一样,Mine比Kenny Kerr的'AutoPtr'要好。他复制了'std :: auto_ptr'的所有设计缺陷。 – 2012-08-06 16:52:22

+0

好吧,听起来像我需要阅读。我应该如何将这些智能指针与CComBPtr(及相关)类型一起使用?我使用的方法是否正确,还是有更好的方法? – Justin 2012-08-06 16:54:21

0

如果你想单独编译托管代码和非托管代码,那么here是一个链接。

使用这个你可以保留两者的味道。