#ifndef _COM_COMPOINTER_HPP_ #define _COM_COMPOINTER_HPP_ #ifndef _COMMON_SMARTPOINTER_HPP_ #include #endif #ifndef _COM_COM_HPP_ #include #endif #ifndef _COM_RESULT_HPP_ #include #endif template class ComPointer : public SmartPointer { public: ComPointer(void); ComPointer(T *pComPointer,PointerDisposition::Disposition disposition=PointerDisposition::Assume); ComPointer(const ComPointer &comPointer); virtual ~ComPointer(); ComResult createInstance(REFCLSID rclsId,REFIID riid); ComResult createInstance(REFCLSID rcldId); void Release(void); void destroy(void); operator T**(void); }; template inline ComPointer::ComPointer(void) { } template inline ComPointer::ComPointer(T *pComPointer,PointerDisposition::Disposition disposition) : SmartPointer(pComPointer,disposition) { } template inline ComPointer::ComPointer(const ComPointer &comPointer) : SmartPointer(comPointer) { } template inline ComPointer::~ComPointer() { Release(); } template inline ComResult ComPointer::createInstance(REFCLSID rclsId,REFIID riid) { ComObj comObj; return comObj.createInstance(rclsId,riid,(SmartPointer&)*this); } template inline ComResult ComPointer::createInstance(REFCLSID rclsId) { ComObj comObj; return comObj.createInstance(rclsId,__uuidof(T),(SmartPointer&)*this); } template inline ComPointer::operator T**(void) { Release(); return ppt(); } template inline void ComPointer::destroy(void) { Release(); } template inline void ComPointer::Release(void) { if(!isOkay())return; ((IUnknown*)((T *)*this))->Release(); SmartPointer::destroy(); } #endif