#pragma once
template <class T>
static HRESULT __CopyValue(T* src, T* dst)
{
if (src == NULL || dst == NULL)
{
return E_FAIL;
}
*dst = *src;
return S_OK;
}
template <>
static HRESULT __CopyValue<CComDynamicUnkArray>(CComDynamicUnkArray* src, CComDynamicUnkArray* dst)
{
if (src == NULL || dst == NULL)
{
return E_FAIL;
}
dst->clear();
for (int i = 0; i < (int)src->GetSize(); i++)
{
dst->Add(src->GetAt(i));
}
return S_OK;
}
////////////////////////////////////////////////////////////////////////////////
// CRestoreValue
template<class T>
class CRestoreValue
{
public:
CRestoreValue(T& value) : m_value(value)
{
HRESULT hr = S_OK;
hr = ::__CopyValue(&m_value, &m_valueOld);
if (FAILED(hr))
{
// 無視する。。
}
m_hr = hr;
}
~CRestoreValue()
{
HRESULT hr = S_OK;
hr = ::__CopyValue(&m_valueOld, &m_value);
if (FAILED(hr))
{
// 無視する。。
}
}
public:
T& m_value;
T m_valueOld;
HRESULT m_hr;
};