/* This code was all ripped straight from _ATL_Internals_ from Addison-Wesley. I couldn't find any use restrictions, but I didn't write it, so I don't think I stamp it as GPL.. */ #pragma once template struct _CopyVariantFromAdaptItf { static HRESULT copy(VARIANT* p1, CAdapt< CComPtr >* p2) { HRESULT hr = p2->m_T->QueryInterface(IID_IDispatch, (void**)&p1->pdispVal); if(SUCCEEDED(hr)) p1->vt = VT_DISPATCH; else { hr = p2->m_T->QueryInterface(IID_IUnknown, (void**)&p1->punkVal); if(SUCCEEDED(hr)) p1->vt = VT_UNKNOWN; } return hr; } static void init(VARIANT* p) { VariantInit(p); } static void destroy(VARIANT* p) { VariantClear(p); } }; template struct _CopyItfFromAdaptItf { static HRESULT copy(T** p1, CAdapt< CComPtr >* p2) { if( *p1 = p2->m_T ) return (*p1)->AddRef(), S_OK; return E_POINTER; } static void init(T** p) {} static void destroy(T** p) { if(*p) (*p)->Release(); } };