Module: wine Branch: refs/heads/master Commit: caefc340844e30e90f64013a22a31b832a8ddb62 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=caefc340844e30e90f64013a...
Author: Robert Shearman rob@codeweavers.com Date: Mon May 8 12:41:06 2006 +0100
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 deletions(-)
diff --git a/dlls/ole32/compositemoniker.c b/dlls/ole32/compositemoniker.c index c8f1dfa..99ffd3c 100644 --- a/dlls/ole32/compositemoniker.c +++ b/dlls/ole32/compositemoniker.c @@ -37,7 +37,7 @@ #include "moniker.h"
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* pmkThi 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 e36dc0f..d35f87b 100644 --- a/dlls/ole32/moniker.h +++ b/dlls/ole32/moniker.h @@ -4,10 +4,12 @@ #define __WINE_MONIKER_H__ 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 6e9aaf8..8dc4ffb 100644 --- a/dlls/ole32/oleproxy.c +++ b/dlls/ole32/oleproxy.c @@ -1016,6 +1016,8 @@ HRESULT WINAPI DllGetClassObject(REFCLSI 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;