windows-nt/Source/XPSP1/NT/multimedia/dshow/vidctl/msvidctl/createregbag.h
2020-09-26 16:20:57 +08:00

149 lines
4.6 KiB
C++

// CreateRegBag.h : Declaration of the CCreateRegBag
#ifndef __CREATEREGBAG_H_
#define __CREATEREGBAG_H_
#include <comcat.h>
#include <objsafe.h>
#include <propertybag2impl.h>
#include <objectwithsiteimplsec.h>
#include <throw.h>
/////////////////////////////////////////////////////////////////////////////
// CRegBagBase
class ATL_NO_VTABLE CRegBagBase : public CComObjectRootEx<CComMultiThreadModel>,
public IPropertyBag,
public IPropertyBag2Impl<CRegBagBase>,
public IObjectWithSiteImplSec<CRegBagBase>
{
BEGIN_COM_MAP(CRegBagBase)
COM_INTERFACE_ENTRY(IPropertyBag2)
COM_INTERFACE_ENTRY(IPropertyBag)
COM_INTERFACE_ENTRY(IObjectWithSite)
END_COM_MAP_WITH_FTM()
CRegBagBase() {}
virtual ~CRegBagBase() {}
// IPropertyBag
STDMETHOD(Read)(LPCOLESTR pszPropName, VARIANT *pVar, IErrorLog *pErrorLog);
STDMETHOD(Write)(LPCOLESTR pszPropName, VARIANT *pVar);
protected:
// internal utility functions
HRESULT DeleteSubKey(CRegKey& hk, LPCOLESTR pszPropName);
HRESULT DeleteValue(CRegKey& hk, LPCOLESTR pszPropName);
HRESULT SaveObject(CRegKey& hk, LPCOLESTR pszPropName, VARIANT* pV);
HRESULT RegConvertToVARIANT(VARIANT *pVar, DWORD dwType, LPBYTE pbData, DWORD cbSize);
CRegKey m_hk;
};
/////////////////////////////////////////////////////////////////////////////
// CRegBag
class CRegBag :
public CComObject<CRegBagBase>
{
public:
CRegBag(HKEY hk, LPCTSTR subkey, DWORD ulOptions, REGSAM samDesired) {
DWORD rc = m_hk.Open(hk, subkey, samDesired, ulOptions);
if (rc != ERROR_SUCCESS) {
THROWCOM(HRESULT_FROM_WIN32(rc));
}
}
virtual ~CRegBag() {}
// IPropertyBag2
STDMETHOD(CountProperties)(ULONG * pcProperties);
STDMETHOD(GetPropertyInfo)(ULONG iProperty, ULONG cProperties, PROPBAG2 * pPropBag, ULONG * pcProperties);
STDMETHOD(LoadObject)(LPCOLESTR pstrName, ULONG dwHint, IUnknown * pUnkObject, IErrorLog * pErrLog);
};
template<class BAGTYPE, class PERSISTTYPE> HRESULT LoadPersistedObject(PERSISTTYPE pPersistObj,
CLSID& clsid,
VARIANT* pVar,
HKEY hk,
LPCOLESTR pszPropName,
IErrorLog *pErrorLog) {
ASSERT(pVar && hk && pszPropName);
HRESULT hr = NOERROR;
if (!pPersistObj && ((pVar->vt == VT_UNKNOWN) ? pVar->punkVal : pVar->pdispVal)) {
// got passed an object to initialize and the object doesn't support persist
return E_NOINTERFACE;
} else if (!pPersistObj) {
hr = pPersistObj.CoCreateInstance(clsid);
if (FAILED(hr)) {
// we ignore subkeys if they don't look like objects
// but if they have a default value that successfully converts to a guid
// and if that object can't be created then its an error
return hr;
}
hr = pPersistObj->InitNew();
if (FAILED(hr) && hr != E_NOTIMPL) {
return hr;
}
ASSERT(pVar->vt == VT_UNKNOWN || pVar->vt == VT_DISPATCH);
switch(pVar->vt) {
case VT_DISPATCH:
pVar->pdispVal = PQDispatch(pPersistObj);
if (pVar->pdispVal) {
pVar->pdispVal->AddRef();
break;
} else {
pVar->vt = VT_UNKNOWN;
}
// fall thru
case VT_UNKNOWN:
pVar->punkVal = pPersistObj;
(pVar->punkVal)->AddRef();
}
}
USES_CONVERSION;
BAGTYPE pBag(new CRegBag(hk, OLE2CT(pszPropName), 0, KEY_READ));
if (!pBag) {
return E_OUTOFMEMORY;
}
hr = pPersistObj->Load(pBag, pErrorLog);
return hr;
};
/////////////////////////////////////////////////////////////////////////////
// CCreateRegBag
class ATL_NO_VTABLE CCreateRegBag :
public CComObjectRootEx<CComMultiThreadModel>,
public CComCoClass<CCreateRegBag, &CLSID_CreatePropBagOnRegKey>,
public IObjectWithSiteImplSec<CCreateRegBag>,
public ICreatePropBagOnRegKey
{
public:
CCreateRegBag()
{
}
REGISTER_NONAUTOMATION_OBJECT_WITH_TM(IDS_PROJNAME,
IDS_REG_CREATEREGBAG_DESC,
LIBID_MSVidCtlLib,
CLSID_CreatePropBagOnRegKey, tvBoth);
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CCreateRegBag)
COM_INTERFACE_ENTRY(ICreatePropBagOnRegKey)
COM_INTERFACE_ENTRY(IObjectWithSite)
END_COM_MAP_WITH_FTM()
BEGIN_CATEGORY_MAP(CVidCtl)
IMPLEMENTED_CATEGORY(CATID_PersistsToPropertyBag)
END_CATEGORY_MAP()
// ICreateRegBag
public:
// ICreatePropBagOnRegKey
STDMETHOD(Create)(HKEY hkey, LPCOLESTR subkey, DWORD options, DWORD sam, REFIID iid, LPVOID* ppBag);
};
#endif //__CREATEREGBAG_H_