#pragma once
#include <comdef.h>
////////////////////////////////////////////////////////////////////////////////
// CRotHelper
class CRotHelper
{
public:
CRotHelper()
{
m_dwRegister = 0;
}
virtual ~CRotHelper()
{
HRESULT hr = S_OK;
hr = this->Revoke();
if (FAILED(hr))
{
// 無視する。。
}
}
public:
HRESULT Register(IUnknownPtr spUnkObject, LPCTSTR szItem)
{
HRESULT hr = S_OK;
hr = this->Revoke();
if (FAILED(hr))
{
// 無視しよう。。
}
hr = CRotHelper::Register(spUnkObject, szItem, &m_dwRegister);
if (FAILED(hr))
{
return hr;
}
return hr;
}
HRESULT Revoke()
{
HRESULT hr = S_OK;
if (m_dwRegister == 0)
{
return S_FALSE;
}
DWORD dwRegister = m_dwRegister;
m_dwRegister = 0;
hr = CRotHelper::Revoke(dwRegister);
if (FAILED(hr))
{
return hr;
}
return hr;
}
public:
static HRESULT Register(IUnknownPtr spUnkObject, IMonikerPtr spMoniker, DWORD* pdwRegister)
{
if (pdwRegister == NULL)
{
return E_POINTER;
}
HRESULT hr = S_OK;
IRunningObjectTablePtr spROT;
hr = ::GetRunningObjectTable(0, &spROT);
if (FAILED(hr))
{
return hr;
}
hr = spROT->Register(0, spUnkObject, spMoniker, pdwRegister);
if (FAILED(hr))
{
return hr;
}
return hr;
}
static HRESULT Register(IUnknownPtr spUnkObject, LPCTSTR szItem, DWORD* pdwRegister)
{
USES_CONVERSION;
HRESULT hr = S_OK;
IMonikerPtr spMoniker;
hr = ::CreateItemMoniker(L"!", T2OLE(szItem), &spMoniker);
if (FAILED(hr))
{
return hr;
}
return CRotHelper::Register(spUnkObject, spMoniker, pdwRegister);
}
static HRESULT Revoke(DWORD dwRegister)
{
HRESULT hr = S_OK;
IRunningObjectTablePtr spROT;
hr = ::GetRunningObjectTable(0, &spROT);
if (FAILED(hr))
{
return hr;
}
hr = spROT->Revoke(dwRegister);
if (FAILED(hr))
{
return hr;
}
return hr;
}
public:
DWORD m_dwRegister;
};