Robert Shearman : ole32: Implement several class moniker functions using the description provided on MSDN .

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


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

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

ole32: Implement several class moniker functions using the description provided on MSDN.

---

 dlls/ole32/classmoniker.c  |   58 +++++++++++++++++++++++++++++++++++---------
 dlls/ole32/tests/moniker.c |    3 --
 2 files changed, 46 insertions(+), 15 deletions(-)

diff --git a/dlls/ole32/classmoniker.c b/dlls/ole32/classmoniker.c
index 74a0952..afdf48a 100644
--- a/dlls/ole32/classmoniker.c
+++ b/dlls/ole32/classmoniker.c
@@ -242,8 +242,33 @@ static HRESULT WINAPI ClassMoniker_BindT
                                             REFIID riid,
                                             VOID** ppvResult)
 {
-    FIXME("(%p,%p,%p,%p)\n", pbc, pmkToLeft, riid, ppvResult);
-    return E_NOTIMPL;
+    ClassMoniker *This = (ClassMoniker *)iface;
+    BIND_OPTS2 bindopts;
+    IClassActivator *pActivator;
+    HRESULT hr;
+
+    TRACE("(%p,%p,%p,%p)\n", pbc, pmkToLeft, riid, ppvResult);
+
+    bindopts.cbStruct = sizeof(bindopts);
+    IBindCtx_GetBindOptions(pbc, (BIND_OPTS *)&bindopts);
+
+    if (!pmkToLeft)
+        return CoGetClassObject(&This->clsid, bindopts.dwClassContext, NULL,
+                                riid, ppvResult);
+    else
+    {
+        hr = IMoniker_BindToObject(pmkToLeft, pbc, NULL, &IID_IClassActivator,
+                                   (void **)&pActivator);
+        if (FAILED(hr)) return hr;
+
+        hr = IClassActivator_GetClassObject(pActivator, &This->clsid,
+                                            bindopts.dwClassContext,
+                                            bindopts.locale, riid, ppvResult);
+
+        IClassActivator_Release(pActivator);
+
+        return hr;
+    }
 }
 
 /******************************************************************************
@@ -255,8 +280,8 @@ static HRESULT WINAPI ClassMoniker_BindT
                                              REFIID riid,
                                              VOID** ppvResult)
 {
-    FIXME("(%p,%p,%p,%p)\n",pbc, pmkToLeft, riid, ppvResult);
-    return E_NOTIMPL;
+    TRACE("(%p,%p,%p,%p)\n",pbc, pmkToLeft, riid, ppvResult);
+    return ClassMoniker_BindToObject(iface, pbc, pmkToLeft, riid, ppvResult);
 }
 
 /******************************************************************************
@@ -424,8 +449,9 @@ static HRESULT WINAPI ClassMoniker_IsRun
                                          IMoniker* pmkToLeft,
                                          IMoniker* pmkNewlyRunning)
 {
-    FIXME("(%p, %p, %p)\n", pbc, pmkToLeft, pmkNewlyRunning);
+    TRACE("(%p, %p, %p)\n", pbc, pmkToLeft, pmkNewlyRunning);
 
+    /* as in native */
     return E_NOTIMPL;
 }
 
@@ -437,8 +463,9 @@ static HRESULT WINAPI ClassMoniker_GetTi
                                                    IMoniker* pmkToLeft,
                                                    FILETIME* pItemTime)
 {
-    FIXME("(%p, %p, %p)\n", pbc, pmkToLeft, pItemTime);
-    return E_NOTIMPL;
+    TRACE("(%p, %p, %p)\n", pbc, pmkToLeft, pItemTime);
+
+    return MK_E_UNAVAILABLE;
 }
 
 /******************************************************************************
@@ -463,18 +490,25 @@ static HRESULT WINAPI ClassMoniker_Commo
     
     TRACE("(%p, %p)\n", pmkOther, ppmkPrefix);
 
+    *ppmkPrefix = NULL;
+
     IMoniker_IsSystemMoniker(pmkOther, &mkSys);
 
     /* If the other moniker is an class moniker that is equal to this moniker, this method sets *ppmkPrefix */
     /* to this moniker and returns MK_S_US */
 
-    if((mkSys == MKSYS_CLASSMONIKER) && (IMoniker_IsEqual(iface, pmkOther) == S_OK) ){
-
-        *ppmkPrefix = iface;
+    if (mkSys == MKSYS_CLASSMONIKER)
+    {
+        if (IMoniker_IsEqual(iface, pmkOther) == S_OK)
+        {
+            *ppmkPrefix = iface;
 
-        IMoniker_AddRef(iface);
+            IMoniker_AddRef(iface);
 
-        return MK_S_US;
+            return MK_S_US;
+        }
+        else
+            return MK_E_NOPREFIX;
     }
     else
         /* otherwise, the method calls the MonikerCommonPrefixWith function. This function correctly handles */
diff --git a/dlls/ole32/tests/moniker.c b/dlls/ole32/tests/moniker.c
index 14dcda3..6ae8cf1 100644
--- a/dlls/ole32/tests/moniker.c
+++ b/dlls/ole32/tests/moniker.c
@@ -523,16 +523,13 @@ static void test_class_moniker(void)
     ok(hr == E_NOTIMPL, "IMoniker_IsRunning should return E_NOTIMPL, not 0x%08lx\n", hr);
 
     hr = IMoniker_GetTimeOfLastChange(moniker, bindctx, NULL, &filetime);
-    todo_wine
     ok(hr == MK_E_UNAVAILABLE, "IMoniker_GetTimeOfLastChange should return MK_E_UNAVAILABLE, not 0x%08lx\n", hr);
 
     hr = IMoniker_BindToObject(moniker, bindctx, NULL, &IID_IUnknown, (void **)&unknown);
-    todo_wine
     ok_ole_success(hr, IMoniker_BindToStorage);
     IUnknown_Release(unknown);
 
     hr = IMoniker_BindToStorage(moniker, bindctx, NULL, &IID_IUnknown, (void **)&unknown);
-    todo_wine
     ok_ole_success(hr, IMoniker_BindToStorage);
     IUnknown_Release(unknown);
 




More information about the wine-cvs mailing list