■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)