From caefc340844e30e90f64013a22a31b832a8ddb62 Mon Sep 17 00:00:00 2001 From: Robert Shearman Date: Mon, 8 May 2006 12:41:06 +0100 Subject: [PATCH] ole32: Add a class factory for composite monikers. --- dlls/ole32/compositemoniker.c | 69 ++++++++++++++++++++++++++++++++++- dlls/ole32/moniker.h | 2 + dlls/ole32/oleproxy.c | 2 + 3 files changed, 72 insertions(+), 1 deletion(-) diff --git a/dlls/ole32/compositemoniker.c b/dlls/ole32/compositemoniker.c index c8f1dfa78b9..99ffd3cb464 100644 --- a/dlls/ole32/compositemoniker.c +++ b/dlls/ole32/compositemoniker.c @@ -37,7 +37,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(ole); -static const CLSID CLSID_CompositeMoniker = { +const CLSID CLSID_CompositeMoniker = { 0x309, 0, 0, {0xC0, 0, 0, 0, 0, 0, 0, 0x46} }; @@ -1944,3 +1944,70 @@ MonikerCommonPrefixWith(IMoniker* pmkThis,IMoniker* pmkOther,IMoniker** ppmkComm FIXME("(),stub!\n"); return E_NOTIMPL; } + +static HRESULT WINAPI CompositeMonikerCF_QueryInterface(LPCLASSFACTORY iface, + REFIID riid, LPVOID *ppv) +{ + *ppv = NULL; + if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IClassFactory)) + { + *ppv = iface; + IUnknown_AddRef(iface); + return S_OK; + } + return E_NOINTERFACE; +} + +static ULONG WINAPI CompositeMonikerCF_AddRef(LPCLASSFACTORY iface) +{ + return 2; /* non-heap based object */ +} + +static ULONG WINAPI CompositeMonikerCF_Release(LPCLASSFACTORY iface) +{ + return 1; /* non-heap based object */ +} + +static HRESULT WINAPI CompositeMonikerCF_CreateInstance(LPCLASSFACTORY iface, + LPUNKNOWN pUnk, REFIID riid, LPVOID *ppv) +{ + CompositeMonikerImpl* newCompositeMoniker; + HRESULT hr; + + TRACE("(%p, %s, %p)\n", pUnk, debugstr_guid(riid), ppv); + + *ppv = NULL; + + if (pUnk) + return CLASS_E_NOAGGREGATION; + + hr = CompositeMonikerImpl_Construct(&newCompositeMoniker, NULL, NULL); + + if (SUCCEEDED(hr)) + hr = CompositeMonikerImpl_QueryInterface((IMoniker*)newCompositeMoniker, riid, ppv); + if (FAILED(hr)) + HeapFree(GetProcessHeap(),0,newCompositeMoniker); + + return hr; +} + +static HRESULT WINAPI CompositeMonikerCF_LockServer(LPCLASSFACTORY iface, BOOL fLock) +{ + FIXME("(%d), stub!\n",fLock); + return S_OK; +} + +static const IClassFactoryVtbl CompositeMonikerCFVtbl = +{ + CompositeMonikerCF_QueryInterface, + CompositeMonikerCF_AddRef, + CompositeMonikerCF_Release, + CompositeMonikerCF_CreateInstance, + CompositeMonikerCF_LockServer +}; +static const IClassFactoryVtbl *CompositeMonikerCF = &CompositeMonikerCFVtbl; + +HRESULT CompositeMonikerCF_Create(REFIID riid, LPVOID *ppv) +{ + return IClassFactory_QueryInterface((IClassFactory *)&CompositeMonikerCF, riid, ppv); +} diff --git a/dlls/ole32/moniker.h b/dlls/ole32/moniker.h index e36dc0fe4a8..d35f87b85d5 100644 --- a/dlls/ole32/moniker.h +++ b/dlls/ole32/moniker.h @@ -4,10 +4,12 @@ extern const CLSID CLSID_FileMoniker; extern const CLSID CLSID_ItemMoniker; extern const CLSID CLSID_AntiMoniker; +extern const CLSID CLSID_CompositeMoniker; HRESULT FileMonikerCF_Create(REFIID riid, LPVOID *ppv); HRESULT ItemMonikerCF_Create(REFIID riid, LPVOID *ppv); HRESULT AntiMonikerCF_Create(REFIID riid, LPVOID *ppv); +HRESULT CompositeMonikerCF_Create(REFIID riid, LPVOID *ppv); HRESULT MonikerMarshal_Create(IMoniker *inner, IUnknown **outer); diff --git a/dlls/ole32/oleproxy.c b/dlls/ole32/oleproxy.c index 6e9aaf8f8f9..8dc4ffb4842 100644 --- a/dlls/ole32/oleproxy.c +++ b/dlls/ole32/oleproxy.c @@ -1016,6 +1016,8 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID iid,LPVOID *ppv) return ItemMonikerCF_Create(iid, ppv); if (IsEqualCLSID(rclsid, &CLSID_AntiMoniker)) return AntiMonikerCF_Create(iid, ppv); + if (IsEqualCLSID(rclsid, &CLSID_CompositeMoniker)) + return CompositeMonikerCF_Create(iid, ppv); FIXME("\n\tCLSID:\t%s,\n\tIID:\t%s\n",debugstr_guid(rclsid),debugstr_guid(iid)); return CLASS_E_CLASSNOTAVAILABLE;