DirectXで使用されているCreatePropBagOnRegKeyの互換のオブジェクト[ATL]

(2003.09.18)
■RegBagObject.h
#pragma once
 
#include "RegHelper.h"
 
 
/////////////////////////////////////////////////////////////////////////////
// CRegBagObject
 
class ATL_NO_VTABLE CRegBagObject : 
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CRegBagObject, &CLSID_NULL>,
    //
    public IPropertyBag
{
public:
    CRegBagObject()
    {
    }
 
 
BEGIN_COM_MAP(CRegBagObject)
    COM_INTERFACE_ENTRY(IPropertyBag)
END_COM_MAP()
 
 
    DECLARE_PROTECT_FINAL_CONSTRUCT()
 
    HRESULT FinalConstruct()
    {
        // 初期化コードを記述する
        m_hKey = NULL;
        m_strSubKey = _T("");
        m_ulOptions = 0;
        m_samDesired = 0;
 
        return S_OK;
    }
    
    void FinalRelease() 
    {
        // 終了コードを記述する
    }
 
// IPropertyBag
public:
    STDMETHOD(Read)(/* [in] */ LPCOLESTR pszPropName, /* [out][in] */ VARIANT *pVar, /* [in] */ IErrorLog *pErrorLog)
    {
        if (pVar == NULL)
        {
            return E_POINTER;
        }
 
        try
        {
            *pVar = _variant_t().Detach();
 
            CString strEntry = (LPCTSTR)_bstr_t(pszPropName);
            CString strValue = CRegHelper::SHGetStringValue(
                m_hKey,
                m_strSubKey,
                strEntry);
 
            _variant_t varValue = strValue;
            *pVar = varValue.Detach();
        }
        catch (...)
        {
            return E_FAIL;
        }
 
        return S_OK;
    }
    STDMETHOD(Write)(/* [in] */ LPCOLESTR pszPropName, /* [in] */ VARIANT *pVar)
    {
        if (pVar == NULL)
        {
            return E_POINTER;
        }
 
        try
        {
            CString strEntry = (LPCTSTR)_bstr_t(pszPropName);
            CString strValue = (LPCTSTR)(_bstr_t)_variant_t(*pVar);
            CRegHelper::SHSetStringValue(
                m_hKey,
                m_strSubKey,
                strEntry,
                strValue);
        }
        catch (...)
        {
            return E_FAIL;
        }
 
        return S_OK;
    }
 
public:
    HRESULT Init(HKEY hkey, LPCOLESTR subkey, DWORD ulOptions, DWORD samDesired)
    {
        m_hKey = hkey;
        m_strSubKey = subkey;
        m_ulOptions = ulOptions;
        m_samDesired = samDesired;
 
        return S_OK;
    }
 
public:
    static Create(/*[in]*/ HKEY hkey, /*[in]*/ LPCOLESTR subkey, /*[in]*/ DWORD ulOptions,
        /*[in]*/ DWORD samDesired, REFIID iid, /*[out]*/ LPVOID *ppBag)
    {
        if (ppBag == NULL)
        {
            return E_POINTER;
        }
 
        HRESULT hr = S_OK;
 
        try
        {
            CComObject<CRegBagObject>* pRegBag = NULL;
            hr = CComObject<CRegBagObject>::CreateInstance(&pRegBag);
            if (FAILED(hr))
            {
                return hr;
            }
 
            hr = pRegBag->Init(hkey, subkey, ulOptions, samDesired);
            if (FAILED(hr))
            {
                delete pRegBag;
                return hr;
            }
 
            hr = pRegBag->QueryInterface(iid, ppBag);
            if (FAILED(hr))
            {
                delete pRegBag;
                return hr;
            }
        }
        catch (...)
        {
            return E_FAIL;
        }
 
        return hr;
    }
 
protected:
    HKEY m_hKey;
    CString m_strSubKey;
    DWORD m_ulOptions;
    DWORD m_samDesired;
};
 
 
■CreatePropBagOnRegKey.h
// CreatePropBagOnRegKey.h : CCreatePropBagOnRegKey の宣言
 
#pragma once
#include "resource.h"       // メイン シンボル
 
 
#include <RegBag.h>            // ICreatePropBagOnRegKey
 
#include "RegBagObject.h"
 
 
/////////////////////////////////////////////////////////////////////////////
// CCreatePropBagOnRegKey
 
class ATL_NO_VTABLE CCreatePropBagOnRegKey : 
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CCreatePropBagOnRegKey, &CLSID_CreatePropBagOnRegKey>,
    //
    public IPersistImpl<CCreatePropBagOnRegKey>,
    public ICreatePropBagOnRegKey
{
public:
    CCreatePropBagOnRegKey()
    {
    }
 
DECLARE_REGISTRY_RESOURCEID(IDR_CREATEPROPBAGONREGKEY)
 
 
BEGIN_COM_MAP(CCreatePropBagOnRegKey)
    COM_INTERFACE_ENTRY(IPersist)
    COM_INTERFACE_ENTRY(ICreatePropBagOnRegKey)
END_COM_MAP()
 
 
    DECLARE_PROTECT_FINAL_CONSTRUCT()
 
    HRESULT FinalConstruct()
    {
        return S_OK;
    }
    
    void FinalRelease() 
    {
    }
 
// ICreatePropBagOnRegKey
public:
    STDMETHOD(Create)(/*[in]*/ HKEY hkey, /*[in]*/ LPCOLESTR subkey, /*[in]*/ DWORD ulOptions,
        /*[in]*/ DWORD samDesired, REFIID iid, /*[out]*/ LPVOID *ppBag)
    {
        return CRegBagObject::Create(hkey, subkey, ulOptions, samDesired, iid, ppBag);
    }
};
 
OBJECT_ENTRY_AUTO(__uuidof(CreatePropBagOnRegKey), CCreatePropBagOnRegKey)
一覧に戻る
© 2003 WAC.com All Right Reserved.