Nikolay Sivov : ole32: Fix (item moniker + antimoniker) composing.

Alexandre Julliard julliard at winehq.org
Wed Jan 29 16:24:08 CST 2020


Module: wine
Branch: master
Commit: 3f10a59ff145967429c4384e0313213296ef6523
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=3f10a59ff145967429c4384e0313213296ef6523

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Wed Jan 29 16:57:04 2020 +0300

ole32: Fix (item moniker + antimoniker) composing.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/ole32/itemmoniker.c   | 14 ++++++--------
 dlls/ole32/tests/moniker.c |  6 +-----
 2 files changed, 7 insertions(+), 13 deletions(-)

diff --git a/dlls/ole32/itemmoniker.c b/dlls/ole32/itemmoniker.c
index 19876aa363..78b23ae633 100644
--- a/dlls/ole32/itemmoniker.c
+++ b/dlls/ole32/itemmoniker.c
@@ -518,7 +518,7 @@ static HRESULT WINAPI ItemMonikerImpl_ComposeWith(IMoniker* iface,
                                                   IMoniker** ppmkComposite)
 {
     HRESULT res=S_OK;
-    DWORD mkSys,mkSys2;
+    DWORD mkSys,mkSys2, order;
     IEnumMoniker* penumMk=0;
     IMoniker *pmostLeftMk=0;
     IMoniker* tempMkComposite=0;
@@ -530,16 +530,14 @@ static HRESULT WINAPI ItemMonikerImpl_ComposeWith(IMoniker* iface,
 
     *ppmkComposite=0;
 
-    IMoniker_IsSystemMoniker(pmkRight,&mkSys);
-
-    /* If pmkRight is an anti-moniker, the returned moniker is NULL */
-    if(mkSys==MKSYS_ANTIMONIKER)
-        return res;
-
+    if (is_anti_moniker(pmkRight, &order))
+    {
+        return order > 1 ? create_anti_moniker(order - 1, ppmkComposite) : S_OK;
+    }
     else
         /* if pmkRight is a composite whose leftmost component is an anti-moniker,           */
         /* the returned moniker is the composite after the leftmost anti-moniker is removed. */
-
+        IMoniker_IsSystemMoniker(pmkRight,&mkSys);
          if(mkSys==MKSYS_GENERICCOMPOSITE){
 
             res=IMoniker_Enum(pmkRight,TRUE,&penumMk);
diff --git a/dlls/ole32/tests/moniker.c b/dlls/ole32/tests/moniker.c
index 61aa0b4a96..ea1e5b1933 100644
--- a/dlls/ole32/tests/moniker.c
+++ b/dlls/ole32/tests/moniker.c
@@ -2414,16 +2414,12 @@ todo_wine
     anti = create_antimoniker(2);
     hr = IMoniker_ComposeWith(moniker, anti, TRUE, &moniker2);
     ok(hr == S_OK, "Failed to compose, hr %#x.\n", hr);
-todo_wine
-    ok(!!moniker2, "Unexpected pointer.\n");
-if (moniker2)
-{
     TEST_MONIKER_TYPE(moniker2, MKSYS_ANTIMONIKER);
     hr = IMoniker_Hash(moniker2, &hash);
     ok(hr == S_OK, "Failed to get hash, hr %#x.\n", hr);
     ok(hash == 0x80000001, "Unexpected hash.\n");
     IMoniker_Release(moniker2);
-}
+
     IMoniker_Release(anti);
 
     IMoniker_Release(moniker);




More information about the wine-cvs mailing list