如何使用_com_ptr_t?(How do I use _com_ptr_t?)

2019-09-16 12:47发布

说我有一家拥有一类D3DDevice

class Thing
{
public:
    Thing()
    {
        D3D11CreateDevice(..., &device, ...);
    }
    ~Thing()
    {
        device->Release();
    }
private:
    ID3D11Device* device;
};

据我了解,我可以使用_com_ptr_t ,以确保在无需显式调用我该对象被删除Release()在析构函数。 问题是,虽然我想不出该模板的正确的语法。

我几乎找不到任何信息_com_ptr_t ,我能找到一个答案最接近的事情是这个(日语)一个 。 继语法那里,我得到一堆编译器错误的:

private:
    //ID3D11Device* device;
    _com_ptr_t <_com_IIID<ID3D11Device, &__uuidof(ID3D11Device)>> device;

error C2143: syntax error : missing ';' before '<'
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
error C2238: unexpected token(s) preceding ';'
error C2065: 'device' : undeclared identifier

顺便说一句,我可以用它来从函数返回COM指针,并确保当他们离开来电者的范围,他们被删除,对不对?

Answer 1:

通常有处理,我会建议COM智能指针的方法有两种:

1)您可以#IMPORT适当的类型库,这将自动生成基于_com_ptr_t智能指针类型。

2)你可以使用但是CComPtr模板来包装你的原始COM指针智能指针是通过自动的AddRef /释放调用负责资源管理,但不会给你太多别的。

因为我有点懒,平时我也不介意被自动生成包装的隐性开销#import ,我通常使用1)。 对使用这种方法的最大好处是, #import机制也产生功能的包装,使COM功能看起来更像是正确的返回类型的正常功能和一个翻译HRESULT_com_error异常对象。 IMHO趋向于提高在C ++ COM代码的控制流程。



Answer 2:

_com_ptr_t是用于定义一个智能指针类型。 例如,让我们定义IHTMLDocument3Ptr类型:

typedef _com_ptr_t <_com_IIID<IHTMLDocument3, &__uuidof(IHTMLDocument3)>> IHTMLDocument3Ptr;

没有为这个简单的宏:

_COM_SMARTPTR_TYPEDEF(IHTMLDocument3, IID_IHTMLDocument3);

这将创建IHTMLDocument3Ptr,智能指针:

IHTMLDocument3Ptr htmlDocument3;

使用CComQIPtr这将被定义为:

CComQIPtr<IHTMLDocument3> htmlDocument3;

还有就是“comdefsp.h”文件与预定义的智能指针对于很多COM接口( https://singularity.svn.codeplex.com/svn/base/Windows/Inc/comdefsp.h )。 该“comdef.h”文件自动包含它。 例如,对于一个的IDispatch智能指针已定义:

IDispatchPtr dispatch;

使用但是CComPtr这将将被定义为:

CComPtr<IDispatch> dispatch;

_com_ptr_t =无ATL

使用的优点_com_ptr_t超过CComPtr/CComQIPtr是, 你不必链接到ATL库

不需要ATL库等智能COM指针_bstr_t (等效CComBSTR )和_variant_t (相当于CComVariant )。



Answer 3:

从你的问题的第二个代码中的错误意味着,编译器不知道的类型之一(或两者)之前< :你需要包括适当的标题,以保证双方_com_ptr_t_com_IIID是有效的和已知的类型。 此外, >>可能被解析为“右移”运营商,把他们之间的空间,让合适的,便携式解析

comdef.h应该解决这两个问题 (见代码中列出)



文章来源: How do I use _com_ptr_t?
标签: c++ com