[PATCH 3/7] ole32: Use the reduced forms of monikers for comparison in the running object table.

Robert Shearman rob at codeweavers.com
Wed Dec 27 20:41:45 CST 2006


---
  dlls/ole32/moniker.c |   41 +++++++++++++++++++++++++++++++++++++++--
  1 files changed, 39 insertions(+), 2 deletions(-)
-------------- next part --------------
diff --git a/dlls/ole32/moniker.c b/dlls/ole32/moniker.c
index 6a26304..9567bf2 100644
--- a/dlls/ole32/moniker.c
+++ b/dlls/ole32/moniker.c
@@ -159,6 +159,19 @@ static HRESULT get_moniker_comparison_da
     return S_OK;
 }
 
+static HRESULT reduce_moniker(IMoniker *pmk, IMoniker **pmkReduced)
+{
+    IBindCtx *pbc;
+    HRESULT hr = CreateBindCtx(0, &pbc);
+    if (FAILED(hr))
+        return hr;
+    hr = IMoniker_Reduce(pmk, pbc, MKRREDUCE_ALL, NULL, pmkReduced);
+    if (FAILED(hr))
+        ERR("reducing moniker failed with error 0x%08x\n", hr);
+    IBindCtx_Release(pbc);
+    return hr;
+}
+
 /***********************************************************************
  *        RunningObjectTable_QueryInterface
  */
@@ -329,10 +342,19 @@ RunningObjectTableImpl_Register(IRunning
         return hr;
     }
 
-    hr = get_moniker_comparison_data(pmkObjectName, &rot_entry->moniker_data);
+    hr = reduce_moniker(pmkObjectName, &pmkObjectName);
+    if (FAILED(hr))
+    {
+        rot_entry_delete(rot_entry);
+        return hr;
+    }
+
+    hr = get_moniker_comparison_data(pmkObjectName,
+                                     &rot_entry->moniker_data);
     if (hr != S_OK)
     {
         rot_entry_delete(rot_entry);
+        IMoniker_Release(pmkObjectName);
         return hr;
     }
 
@@ -340,10 +362,12 @@ RunningObjectTableImpl_Register(IRunning
     if (hr != S_OK)
     {
         rot_entry_delete(rot_entry);
+        IMoniker_Release(pmkObjectName);
         return hr;
     }
     /* marshal moniker */
-    hr = CoMarshalInterface(pStream, &IID_IMoniker, (IUnknown *)pmkObjectName, MSHCTX_LOCAL | MSHCTX_NOSHAREDMEM, NULL, MSHLFLAGS_TABLESTRONG);
+    hr = CoMarshalInterface(pStream, &IID_IMoniker, (IUnknown *)pmkObjectName,
+                            MSHCTX_LOCAL | MSHCTX_NOSHAREDMEM, NULL, MSHLFLAGS_TABLESTRONG);
     /* FIXME: a cleaner way would be to create an IStream class that writes
      * directly to an MInterfacePointer */
     if (hr == S_OK)
@@ -361,6 +385,7 @@ RunningObjectTableImpl_Register(IRunning
         }
     }
     IStream_Release(pStream);
+    IMoniker_Release(pmkObjectName);
     if (hr != S_OK)
     {
         rot_entry_delete(rot_entry);
@@ -433,7 +458,11 @@ RunningObjectTableImpl_IsRunning( IRunni
 
     TRACE("(%p,%p)\n",This,pmkObjectName);
 
+    hr = reduce_moniker(pmkObjectName, &pmkObjectName);
+    if (FAILED(hr))
+        return hr;
     hr = get_moniker_comparison_data(pmkObjectName, &moniker_data);
+    IMoniker_Release(pmkObjectName);
     if (hr != S_OK)
         return hr;
 
@@ -480,7 +509,11 @@ RunningObjectTableImpl_GetObject( IRunni
 
     *ppunkObject = NULL;
 
+    hr = reduce_moniker(pmkObjectName, &pmkObjectName);
+    if (FAILED(hr))
+        return hr;
     hr = get_moniker_comparison_data(pmkObjectName, &moniker_data);
+    IMoniker_Release(pmkObjectName);
     if (hr != S_OK)
         return hr;
 
@@ -569,7 +602,11 @@ RunningObjectTableImpl_GetTimeOfLastChan
     if (pmkObjectName==NULL || pfiletime==NULL)
         return E_INVALIDARG;
 
+    hr = reduce_moniker(pmkObjectName, &pmkObjectName);
+    if (FAILED(hr))
+        return hr;
     hr = get_moniker_comparison_data(pmkObjectName, &moniker_data);
+    IMoniker_Release(pmkObjectName);
     if (hr != S_OK)
         return hr;
 


More information about the wine-patches mailing list