IInstance* m_instance
- простой указатель на объект IInstance. Вы должны сами управлять временем жизни этого указателя. Вы не new
и delete
COM-объекты, как обычные объекты. Вместо этого операционная система выделяет объект при вызове функции WINAPI CoCreateInstance:
// instantiate the CoClass which implements IInstance...
IInstance* instance = 0;
HRESULT hr = CoCreateInstance(__uuidof(mylibrary::MyCoClass), 0, CLSCTX_INPROC_SERVER, __uuidof(mylib::IInstance), &instance);
: :
// We're done, so release the object...
instance->Release();
instance = 0;
Каждый COM-объект осуществляет подсчет ссылок. Когда последняя ссылка на объект была Release()
ed, COM-объект сам разрушается.
Использование CComPtr<>
упрощает управление временем жизни объектов COM. Это умный указатель, похожий по своей природе на std :: auto_ptr или Boost's shared_ptr, но он работает с COM-объектами. Обычно при использовании CComPtr вы вызываете функцию-член CreateInstance
вместо вызова функции WINAPI, и вы не будете явно вызывать Release
, когда закончите. Просто позвольте CComPtr выйти из области видимости, и когда вызывается его деструктор, он вызовет для вас Release
:
void function()
{
// instantiate the CoClass which implements IMyInterface...
CComPtr<IInstance> instance;
instance.CoCreateInstance(__uuidof(mylibrary::MyCoClass));
: :
// We're done, so release the object...
// dont have to do anything, it will be released when function() exits
}