Say I have a class that owns a D3DDevice:
class Thing
{
public:
Thing()
{
D3D11CreateDevice(..., &device, ...);
}
~Thing()
{
device->Release();
}
private:
ID3D11Device* device;
};
From what I understand, I can use _com_ptr_t to ensure that the object gets deleted without my having to explicitly call Release() in the destructor. The problem though is that I can’t figure out the correct syntax for the template.
I could find hardly any information on _com_ptr_t, and the closest thing I could find to an answer was this (Japanese) one. Following the syntax there, I get a bunch of compiler errors:
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
By the way, I can use this to return COM pointers from functions and ensure that they get deleted when they leave the caller’s scope, right?
There are usually two ways of dealing with COM smart pointers that I would recommend:
1) You can #import the appropriate type library, which will auto generate smart pointer types based on _com_ptr_t.
2) You can use the CComPtr template to wrap your raw COM pointer in a smart pointer that takes care of the resource management via automatic AddRef/Release calls, but doesn’t give you much else.
Because I’m a little lazy and normally I don’t mind the implicit overhead of the wrapper auto-generated by
#import, I usually use 1). One of the big benefits of using that approach is that the#importmechanism also generates function wrappers that make COM functions look more like normal functions with proper return types and a translation of theHRESULTto_com_errorexception objects. IMHO that tends to improve the control flow in C++ COM code.