Robert Shearman : ole32: Fix regression caused by an earlier patch that removed the

Alexandre Julliard julliard at wine.codeweavers.com
Mon May 8 15:38:18 CDT 2006


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

Author: Robert Shearman <rob at codeweavers.com>
Date:   Mon May  8 15:54:52 2006 +0100

ole32: Fix regression caused by an earlier patch that removed the
check for the composite moniker having only one moniker in it. In this
case, return the one moniker and free the memory associate with the
composite moniker.

---

 dlls/ole32/compositemoniker.c |   39 ++++++++++++++++++++++++++++-----------
 1 files changed, 28 insertions(+), 11 deletions(-)

diff --git a/dlls/ole32/compositemoniker.c b/dlls/ole32/compositemoniker.c
index 059eabf..8912e6d 100644
--- a/dlls/ole32/compositemoniker.c
+++ b/dlls/ole32/compositemoniker.c
@@ -1764,7 +1764,7 @@ static const IMarshalVtbl VT_MarshalImpl
  *         Composite-Moniker_Construct (local function)
  *******************************************************************************/
 static HRESULT
-CompositeMonikerImpl_Construct(CompositeMonikerImpl** ppThis,
+CompositeMonikerImpl_Construct(IMoniker** ppMoniker,
                LPMONIKER pmkFirst, LPMONIKER pmkRest)
 {
     DWORD mkSys;
@@ -1773,7 +1773,7 @@ CompositeMonikerImpl_Construct(Composite
     HRESULT res;
     CompositeMonikerImpl *This;
 
-    *ppThis = This = HeapAlloc(GetProcessHeap(), 0, sizeof(*This));
+    This = HeapAlloc(GetProcessHeap(), 0, sizeof(*This));
 
     if (!This)
         return E_OUTOFMEMORY;
@@ -1784,7 +1784,7 @@ CompositeMonikerImpl_Construct(Composite
     This->lpvtbl1      = &VT_CompositeMonikerImpl;
     This->lpvtbl2      = &VT_ROTDataImpl;
     This->lpvtblMarshal= &VT_MarshalImpl;
-    This->ref          = 0;
+    This->ref          = 1;
 
     This->tabSize=BLOCK_TAB_SIZE;
     This->tabLastIndex=0;
@@ -1794,7 +1794,10 @@ CompositeMonikerImpl_Construct(Composite
         return E_OUTOFMEMORY;
 
     if (!pmkFirst && !pmkRest)
+    {
+        *ppMoniker = (IMoniker *)This;
         return S_OK;
+    }
 
     IMoniker_IsSystemMoniker(pmkFirst,&mkSys);
 
@@ -1913,6 +1916,16 @@ CompositeMonikerImpl_Construct(Composite
         IEnumMoniker_Release(enumMoniker);
     }
 
+    /* only one moniker, then just return it */
+    if (This->tabLastIndex == 1)
+    {
+        *ppMoniker = This->tabMoniker[0];
+        IMoniker_AddRef(*ppMoniker);
+        IMoniker_Release((IMoniker *)This);
+    }
+    else
+        *ppMoniker = (IMoniker *)This;
+
     return S_OK;
 }
 
@@ -1923,7 +1936,7 @@ HRESULT WINAPI
 CreateGenericComposite(LPMONIKER pmkFirst, LPMONIKER pmkRest,
                LPMONIKER* ppmkComposite)
 {
-    CompositeMonikerImpl* newCompositeMoniker = 0;
+    IMoniker* moniker = 0;
     HRESULT        hr = S_OK;
 
     TRACE("(%p,%p,%p)\n",pmkFirst,pmkRest,ppmkComposite);
@@ -1945,12 +1958,15 @@ CreateGenericComposite(LPMONIKER pmkFirs
     else  if (pmkFirst==NULL && pmkRest==NULL)
         return S_OK;
 
-    hr = CompositeMonikerImpl_Construct(&newCompositeMoniker,pmkFirst,pmkRest);
+    hr = CompositeMonikerImpl_Construct(&moniker,pmkFirst,pmkRest);
 
     if (FAILED(hr))
         return hr;
 
-    return IMoniker_QueryInterface((IMoniker*)newCompositeMoniker,&IID_IMoniker,(void**)ppmkComposite);
+    hr = IMoniker_QueryInterface(moniker,&IID_IMoniker,(void**)ppmkComposite);
+    IMoniker_Release(moniker);
+
+    return hr;
 }
 
 /******************************************************************************
@@ -1989,7 +2005,7 @@ static ULONG WINAPI CompositeMonikerCF_R
 static HRESULT WINAPI CompositeMonikerCF_CreateInstance(LPCLASSFACTORY iface,
     LPUNKNOWN pUnk, REFIID riid, LPVOID *ppv)
 {
-    CompositeMonikerImpl* newCompositeMoniker;
+    IMoniker* pMoniker;
     HRESULT  hr;
 
     TRACE("(%p, %s, %p)\n", pUnk, debugstr_guid(riid), ppv);
@@ -1999,12 +2015,13 @@ static HRESULT WINAPI CompositeMonikerCF
     if (pUnk)
         return CLASS_E_NOAGGREGATION;
 
-    hr = CompositeMonikerImpl_Construct(&newCompositeMoniker, NULL, NULL);
+    hr = CompositeMonikerImpl_Construct(&pMoniker, NULL, NULL);
 
     if (SUCCEEDED(hr))
-        hr = CompositeMonikerImpl_QueryInterface((IMoniker*)newCompositeMoniker, riid, ppv);
-    if (FAILED(hr))
-        HeapFree(GetProcessHeap(),0,newCompositeMoniker);
+    {
+        hr = IMoniker_QueryInterface(pMoniker, riid, ppv);
+        IMoniker_Release(pMoniker);
+    }
 
     return hr;
 }




More information about the wine-cvs mailing list