说我有一家拥有一类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指针,并确保当他们离开来电者的范围,他们被删除,对不对?
通常有处理,我会建议COM智能指针的方法有两种:
1)您可以#IMPORT适当的类型库,这将自动生成基于_com_ptr_t智能指针类型。
2)你可以使用但是CComPtr模板来包装你的原始COM指针智能指针是通过自动的AddRef /释放调用负责资源管理,但不会给你太多别的。
因为我有点懒,平时我也不介意被自动生成包装的隐性开销#import
,我通常使用1)。 对使用这种方法的最大好处是, #import
机制也产生功能的包装,使COM功能看起来更像是正确的返回类型的正常功能和一个翻译HRESULT
到_com_error
异常对象。 IMHO趋向于提高在C ++ COM代码的控制流程。
_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
)。
从你的问题的第二个代码中的错误意味着,编译器不知道的类型之一(或两者)之前<
:你需要包括适当的标题,以保证双方_com_ptr_t
和_com_IIID
是有效的和已知的类型。 此外, >>
可能被解析为“右移”运营商,把他们之间的空间,让合适的,便携式解析
comdef.h
应该解决这两个问题 (见代码中列出)