Commit 1c8bad80 authored by Michael Stefaniuc's avatar Michael Stefaniuc Committed by Alexandre Julliard

shdocvw: COM cleanup in shlinstobj.c.

parent 417534fd
......@@ -40,8 +40,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(shdocvw);
#define ADJUST_THIS(c,m,p) ((c*)(((long)p)-(long)&(((c*)0)->lp##m##Vtbl)))
#define STATIC_CAST(i,p) ((i*)&p->lp##i##Vtbl)
#define CHARS_IN_GUID 39
/******************************************************************************
......@@ -50,11 +48,16 @@ WINE_DEFAULT_DEBUG_CHANNEL(shdocvw);
* Gives access to a registry key's values via the IPropertyBag interface.
*/
typedef struct _RegistryPropertyBag {
const IPropertyBagVtbl *lpIPropertyBagVtbl;
IPropertyBag IPropertyBag_iface;
LONG m_cRef;
HKEY m_hInitPropertyBagKey;
} RegistryPropertyBag;
static inline RegistryPropertyBag *impl_from_IPropertyBag(IPropertyBag *iface)
{
return CONTAINING_RECORD(iface, RegistryPropertyBag, IPropertyBag_iface);
}
static void RegistryPropertyBag_Destroy(RegistryPropertyBag *This) {
TRACE("This=%p)\n", This);
......@@ -65,7 +68,7 @@ static void RegistryPropertyBag_Destroy(RegistryPropertyBag *This) {
static HRESULT WINAPI RegistryPropertyBag_IPropertyBag_QueryInterface(IPropertyBag *iface,
REFIID riid, void **ppv)
{
RegistryPropertyBag *This = ADJUST_THIS(RegistryPropertyBag, IPropertyBag, iface);
RegistryPropertyBag *This = impl_from_IPropertyBag(iface);
TRACE("(iface=%p, riid=%s, ppv=%p)\n", iface, debugstr_guid(riid), ppv);
......@@ -73,7 +76,7 @@ static HRESULT WINAPI RegistryPropertyBag_IPropertyBag_QueryInterface(IPropertyB
return E_INVALIDARG;
if (IsEqualIID(&IID_IUnknown, riid) || IsEqualIID(&IID_IPropertyBag, riid)) {
*ppv = STATIC_CAST(IPropertyBag, This);
*ppv = &This->IPropertyBag_iface;
} else {
*ppv = NULL;
return E_NOINTERFACE;
......@@ -83,8 +86,9 @@ static HRESULT WINAPI RegistryPropertyBag_IPropertyBag_QueryInterface(IPropertyB
return S_OK;
}
static ULONG WINAPI RegistryPropertyBag_IPropertyBag_AddRef(IPropertyBag *iface) {
RegistryPropertyBag *This = ADJUST_THIS(RegistryPropertyBag, IPropertyBag, iface);
static ULONG WINAPI RegistryPropertyBag_IPropertyBag_AddRef(IPropertyBag *iface)
{
RegistryPropertyBag *This = impl_from_IPropertyBag(iface);
ULONG cRef;
TRACE("(iface=%p)\n", iface);
......@@ -97,8 +101,9 @@ static ULONG WINAPI RegistryPropertyBag_IPropertyBag_AddRef(IPropertyBag *iface)
return cRef;
}
static ULONG WINAPI RegistryPropertyBag_IPropertyBag_Release(IPropertyBag *iface) {
RegistryPropertyBag *This = ADJUST_THIS(RegistryPropertyBag, IPropertyBag, iface);
static ULONG WINAPI RegistryPropertyBag_IPropertyBag_Release(IPropertyBag *iface)
{
RegistryPropertyBag *This = impl_from_IPropertyBag(iface);
ULONG cRef;
TRACE("(iface=%p)\n", iface);
......@@ -116,7 +121,7 @@ static ULONG WINAPI RegistryPropertyBag_IPropertyBag_Release(IPropertyBag *iface
static HRESULT WINAPI RegistryPropertyBag_IPropertyBag_Read(IPropertyBag *iface,
LPCOLESTR pwszPropName, VARIANT *pVar, IErrorLog *pErrorLog)
{
RegistryPropertyBag *This = ADJUST_THIS(RegistryPropertyBag, IPropertyBag, iface);
RegistryPropertyBag *This = impl_from_IPropertyBag(iface);
WCHAR *pwszValue;
DWORD dwType, cbData;
LONG res;
......@@ -178,15 +183,15 @@ static HRESULT RegistryPropertyBag_Constructor(HKEY hInitPropertyBagKey, REFIID
pRegistryPropertyBag = heap_alloc(sizeof(RegistryPropertyBag));
if (pRegistryPropertyBag) {
pRegistryPropertyBag->lpIPropertyBagVtbl = &RegistryPropertyBag_IPropertyBagVtbl;
pRegistryPropertyBag->IPropertyBag_iface.lpVtbl = &RegistryPropertyBag_IPropertyBagVtbl;
pRegistryPropertyBag->m_cRef = 0;
pRegistryPropertyBag->m_hInitPropertyBagKey = hInitPropertyBagKey;
/* The clasping AddRef/Release is for the case that QueryInterface fails, which will result
* in a reference count of 0 in the Release call, which will result in object destruction.*/
IPropertyBag_AddRef(STATIC_CAST(IPropertyBag, pRegistryPropertyBag));
hr = IPropertyBag_QueryInterface(STATIC_CAST(IPropertyBag, pRegistryPropertyBag), riid, ppvObject);
IPropertyBag_Release(STATIC_CAST(IPropertyBag, pRegistryPropertyBag));
IPropertyBag_AddRef(&pRegistryPropertyBag->IPropertyBag_iface);
hr = IPropertyBag_QueryInterface(&pRegistryPropertyBag->IPropertyBag_iface, riid, ppvObject);
IPropertyBag_Release(&pRegistryPropertyBag->IPropertyBag_iface);
}
return hr;
......@@ -198,21 +203,26 @@ static HRESULT RegistryPropertyBag_Constructor(HKEY hInitPropertyBagKey, REFIID
* values of a PropertyBag.
*/
typedef struct _InstanceObjectFactory {
const IClassFactoryVtbl *lpIClassFactoryVtbl;
IClassFactory IClassFactory_iface;
LONG m_cRef;
CLSID m_clsidInstance; /* CLSID of the objects to create. */
IPropertyBag *m_pPropertyBag; /* PropertyBag to initialize those objects. */
} InstanceObjectFactory;
static inline InstanceObjectFactory *impl_from_IClassFactory(IClassFactory *iface)
{
return CONTAINING_RECORD(iface, InstanceObjectFactory, IClassFactory_iface);
}
static void InstanceObjectFactory_Destroy(InstanceObjectFactory *This) {
IPropertyBag_Release(This->m_pPropertyBag);
heap_free(This);
}
static HRESULT WINAPI InstanceObjectFactory_IClassFactory_QueryInterface(IClassFactory *iface,
REFIID riid, LPVOID* ppv)
static HRESULT WINAPI InstanceObjectFactory_IClassFactory_QueryInterface(IClassFactory *iface,
REFIID riid, void **ppv)
{
InstanceObjectFactory *This = ADJUST_THIS(InstanceObjectFactory, IClassFactory, iface);
InstanceObjectFactory *This = impl_from_IClassFactory(iface);
TRACE("iface=%p, riid=%s, ppv=%p)\n", iface, debugstr_guid(riid), ppv);
......@@ -220,7 +230,7 @@ static HRESULT WINAPI InstanceObjectFactory_IClassFactory_QueryInterface(IClassF
return E_INVALIDARG;
if (IsEqualIID(&IID_IUnknown, riid) || IsEqualIID(&IID_IClassFactory, riid)) {
*ppv = STATIC_CAST(IClassFactory, This);
*ppv = &This->IClassFactory_iface;
} else {
*ppv = NULL;
return E_NOINTERFACE;
......@@ -232,7 +242,7 @@ static HRESULT WINAPI InstanceObjectFactory_IClassFactory_QueryInterface(IClassF
static ULONG WINAPI InstanceObjectFactory_IClassFactory_AddRef(IClassFactory *iface)
{
InstanceObjectFactory *This = ADJUST_THIS(InstanceObjectFactory, IClassFactory, iface);
InstanceObjectFactory *This = impl_from_IClassFactory(iface);
ULONG cRef;
TRACE("(iface=%p)\n", iface);
......@@ -247,7 +257,7 @@ static ULONG WINAPI InstanceObjectFactory_IClassFactory_AddRef(IClassFactory *if
static ULONG WINAPI InstanceObjectFactory_IClassFactory_Release(IClassFactory *iface)
{
InstanceObjectFactory *This = ADJUST_THIS(InstanceObjectFactory, IClassFactory, iface);
InstanceObjectFactory *This = impl_from_IClassFactory(iface);
ULONG cRef;
TRACE("(iface=%p)\n", iface);
......@@ -265,12 +275,12 @@ static ULONG WINAPI InstanceObjectFactory_IClassFactory_Release(IClassFactory *i
static HRESULT WINAPI InstanceObjectFactory_IClassFactory_CreateInstance(IClassFactory *iface,
IUnknown *pUnkOuter, REFIID riid, LPVOID *ppvObj)
{
InstanceObjectFactory *This = ADJUST_THIS(InstanceObjectFactory, IClassFactory, iface);
InstanceObjectFactory *This = impl_from_IClassFactory(iface);
IPersistPropertyBag *pPersistPropertyBag;
HRESULT hr;
TRACE("(pUnkOuter=%p, riid=%s, ppvObj=%p)\n", pUnkOuter, debugstr_guid(riid), ppvObj);
hr = CoCreateInstance(&This->m_clsidInstance, NULL, CLSCTX_INPROC_SERVER,
&IID_IPersistPropertyBag, (LPVOID*)&pPersistPropertyBag);
if (FAILED(hr)) {
......@@ -324,16 +334,16 @@ static HRESULT InstanceObjectFactory_Constructor(REFCLSID rclsid, IPropertyBag *
pInstanceObjectFactory = heap_alloc(sizeof(InstanceObjectFactory));
if (pInstanceObjectFactory) {
pInstanceObjectFactory->lpIClassFactoryVtbl = &InstanceObjectFactory_IClassFactoryVtbl;
pInstanceObjectFactory->IClassFactory_iface.lpVtbl = &InstanceObjectFactory_IClassFactoryVtbl;
pInstanceObjectFactory->m_cRef = 0;
pInstanceObjectFactory->m_clsidInstance = *rclsid;
pInstanceObjectFactory->m_pPropertyBag = pPropertyBag;
IPropertyBag_AddRef(pPropertyBag);
IClassFactory_AddRef(STATIC_CAST(IClassFactory, pInstanceObjectFactory));
hr = IClassFactory_QueryInterface(STATIC_CAST(IClassFactory, pInstanceObjectFactory),
IClassFactory_AddRef(&pInstanceObjectFactory->IClassFactory_iface);
hr = IClassFactory_QueryInterface(&pInstanceObjectFactory->IClassFactory_iface,
riid, ppvObject);
IClassFactory_Release(STATIC_CAST(IClassFactory, pInstanceObjectFactory));
IClassFactory_Release(&pInstanceObjectFactory->IClassFactory_iface);
}
return hr;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment