ROT(Running ObjectTable)への登録・解除

(2003.02.11)
#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;
};
一覧に戻る
© 2003 WAC.com All Right Reserved.