[PATCH 4/7] ole32: Use IMoniker::GetTimeOfLastChange to attempt to retrieve the last-modified time for the ROT entry.

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


However, fall back to CoFileTimeNow if it fails.
---
  dlls/ole32/moniker.c |   45 +++++++++++++++++++++++++++++++++------------
  1 files changed, 33 insertions(+), 12 deletions(-)
-------------- next part --------------
diff --git a/dlls/ole32/moniker.c b/dlls/ole32/moniker.c
index 9567bf2..49de810 100644
--- a/dlls/ole32/moniker.c
+++ b/dlls/ole32/moniker.c
@@ -159,16 +159,21 @@ static HRESULT get_moniker_comparison_da
     return S_OK;
 }
 
-static HRESULT reduce_moniker(IMoniker *pmk, IMoniker **pmkReduced)
+static HRESULT reduce_moniker(IMoniker *pmk, IBindCtx *pbc, IMoniker **pmkReduced)
 {
-    IBindCtx *pbc;
-    HRESULT hr = CreateBindCtx(0, &pbc);
-    if (FAILED(hr))
-        return hr;
+    IBindCtx *pbcNew = NULL;
+    HRESULT hr;
+    if (!pbc)
+    {
+        hr = CreateBindCtx(0, &pbcNew);
+        if (FAILED(hr))
+            return hr;
+        pbc = pbcNew;
+    }
     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);
+    if (pbcNew) IBindCtx_Release(pbcNew);
     return hr;
 }
 
@@ -292,6 +297,7 @@ RunningObjectTableImpl_Register(IRunning
     HRESULT hr = S_OK;
     IStream *pStream = NULL;
     DWORD mshlflags;
+    IBindCtx *pbc;
 
     TRACE("(%p,%d,%p,%p,%p)\n",This,grfFlags,punkObject,pmkObjectName,pdwRegister);
 
@@ -308,8 +314,6 @@ RunningObjectTableImpl_Register(IRunning
     if (!rot_entry)
         return E_OUTOFMEMORY;
 
-    CoFileTimeNow(&rot_entry->last_modified);
-
     /* marshal object */
     hr = CreateStreamOnHGlobal(NULL, TRUE, &pStream);
     if (hr != S_OK)
@@ -342,13 +346,30 @@ RunningObjectTableImpl_Register(IRunning
         return hr;
     }
 
-    hr = reduce_moniker(pmkObjectName, &pmkObjectName);
+    hr = CreateBindCtx(0, &pbc);
     if (FAILED(hr))
     {
         rot_entry_delete(rot_entry);
         return hr;
     }
 
+    hr = reduce_moniker(pmkObjectName, pbc, &pmkObjectName);
+    if (FAILED(hr))
+    {
+        rot_entry_delete(rot_entry);
+        IBindCtx_Release(pbc);
+        return hr;
+    }
+
+    hr = IMoniker_GetTimeOfLastChange(pmkObjectName, pbc, NULL,
+                                      &rot_entry->last_modified);
+    IBindCtx_Release(pbc);
+    if (FAILED(hr))
+    {
+        CoFileTimeNow(&rot_entry->last_modified);
+        hr = S_OK;
+    }
+
     hr = get_moniker_comparison_data(pmkObjectName,
                                      &rot_entry->moniker_data);
     if (hr != S_OK)
@@ -458,7 +479,7 @@ RunningObjectTableImpl_IsRunning( IRunni
 
     TRACE("(%p,%p)\n",This,pmkObjectName);
 
-    hr = reduce_moniker(pmkObjectName, &pmkObjectName);
+    hr = reduce_moniker(pmkObjectName, NULL, &pmkObjectName);
     if (FAILED(hr))
         return hr;
     hr = get_moniker_comparison_data(pmkObjectName, &moniker_data);
@@ -509,7 +530,7 @@ RunningObjectTableImpl_GetObject( IRunni
 
     *ppunkObject = NULL;
 
-    hr = reduce_moniker(pmkObjectName, &pmkObjectName);
+    hr = reduce_moniker(pmkObjectName, NULL, &pmkObjectName);
     if (FAILED(hr))
         return hr;
     hr = get_moniker_comparison_data(pmkObjectName, &moniker_data);
@@ -602,7 +623,7 @@ RunningObjectTableImpl_GetTimeOfLastChan
     if (pmkObjectName==NULL || pfiletime==NULL)
         return E_INVALIDARG;
 
-    hr = reduce_moniker(pmkObjectName, &pmkObjectName);
+    hr = reduce_moniker(pmkObjectName, NULL, &pmkObjectName);
     if (FAILED(hr))
         return hr;
     hr = get_moniker_comparison_data(pmkObjectName, &moniker_data);


More information about the wine-patches mailing list