Robert Shearman : ole32: Add a class factory for composite monikers.

Alexandre Julliard julliard at wine.codeweavers.com
Mon May 8 09:06:14 CDT 2006


Module: wine
Branch: refs/heads/master
Commit: caefc340844e30e90f64013a22a31b832a8ddb62
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=caefc340844e30e90f64013a22a31b832a8ddb62

Author: Robert Shearman <rob at 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;




More information about the wine-cvs mailing list