Files
Work/com/ComPtr.hpp
2024-08-07 09:12:07 -04:00

95 lines
1.8 KiB
C++

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