Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/ole32/pointermoniker.c | 49 ++++++++++++++++++++-----------------
dlls/ole32/tests/moniker.c | 41 ++++++++++++++++++++++++++++++-
2 files changed, 66 insertions(+), 24 deletions(-)
diff --git a/dlls/ole32/pointermoniker.c b/dlls/ole32/pointermoniker.c
index a62ce3e7b7..c1a0e2ae1c 100644
--- a/dlls/ole32/pointermoniker.c
+++ b/dlls/ole32/pointermoniker.c
@@ -48,9 +48,10 @@ typedef struct PointerMonikerImpl{
static inline PointerMonikerImpl *impl_from_IMoniker(IMoniker *iface)
{
-return CONTAINING_RECORD(iface, PointerMonikerImpl, IMoniker_iface);
+ return CONTAINING_RECORD(iface, PointerMonikerImpl, IMoniker_iface);
}
+static PointerMonikerImpl *unsafe_impl_from_IMoniker(IMoniker *iface);
static HRESULT WINAPI
PointerMonikerImpl_QueryInterface(IMoniker* iface,REFIID riid,void** ppvObject)
{
@@ -58,7 +59,6 @@ PointerMonikerImpl_QueryInterface(IMoniker* iface,REFIID riid,void** ppvObject)
TRACE("(%p,%s,%p)\n",This,debugstr_guid(riid),ppvObject);
- /* Perform a sanity check on the parameters.*/
if ( (This==0) || (ppvObject==0) )
return E_INVALIDARG;
@@ -337,26 +337,20 @@ PointerMonikerImpl_Enum(IMoniker* iface,BOOL fForward, IEnumMoniker** ppenumMoni
/******************************************************************************
* PointerMoniker_IsEqual
******************************************************************************/
-static HRESULT WINAPI
-PointerMonikerImpl_IsEqual(IMoniker* iface,IMoniker* pmkOtherMoniker)
+static HRESULT WINAPI PointerMonikerImpl_IsEqual(IMoniker *iface, IMoniker *other)
{
- PointerMonikerImpl *This = impl_from_IMoniker(iface);
- DWORD mkSys;
+ PointerMonikerImpl *moniker = impl_from_IMoniker(iface), *other_moniker;
- TRACE("(%p,%p)\n",iface,pmkOtherMoniker);
-
- if (pmkOtherMoniker==NULL)
- return S_FALSE;
+ TRACE("%p, %p.\n", iface, other);
- IMoniker_IsSystemMoniker(pmkOtherMoniker,&mkSys);
+ if (!other)
+ return E_INVALIDARG;
- if (mkSys==MKSYS_POINTERMONIKER)
- {
- PointerMonikerImpl *pOtherMoniker = impl_from_IMoniker(pmkOtherMoniker);
- return This->pObject == pOtherMoniker->pObject ? S_OK : S_FALSE;
- }
- else
+ other_moniker = unsafe_impl_from_IMoniker(other);
+ if (!other_moniker)
return S_FALSE;
+
+ return moniker->pObject == other_moniker->pObject ? S_OK : S_FALSE;
}
/******************************************************************************
@@ -412,18 +406,20 @@ PointerMonikerImpl_Inverse(IMoniker* iface,IMoniker** ppmk)
/******************************************************************************
* PointerMoniker_CommonPrefixWith
******************************************************************************/
-static HRESULT WINAPI
-PointerMonikerImpl_CommonPrefixWith(IMoniker* iface,IMoniker* pmkOther,IMoniker** ppmkPrefix)
+static HRESULT WINAPI PointerMonikerImpl_CommonPrefixWith(IMoniker *iface, IMoniker *other, IMoniker **prefix)
{
- TRACE("(%p, %p)\n", pmkOther, ppmkPrefix);
+ TRACE("%p, %p, %p.\n", iface, other, prefix);
+
+ if (!prefix || !other)
+ return E_INVALIDARG;
- *ppmkPrefix = NULL;
+ *prefix = NULL;
- if (PointerMonikerImpl_IsEqual(iface, pmkOther))
+ if (PointerMonikerImpl_IsEqual(iface, other) == S_OK)
{
IMoniker_AddRef(iface);
- *ppmkPrefix=iface;
+ *prefix = iface;
return MK_S_US;
}
@@ -539,6 +535,13 @@ static const IMonikerVtbl VT_PointerMonikerImpl =
PointerMonikerImpl_IsSystemMoniker
};
+static PointerMonikerImpl *unsafe_impl_from_IMoniker(IMoniker *iface)
+{
+ if (iface->lpVtbl != &VT_PointerMonikerImpl)
+ return NULL;
+ return CONTAINING_RECORD(iface, PointerMonikerImpl, IMoniker_iface);
+}
+
/******************************************************************************
* PointerMoniker_Construct (local function)
*******************************************************************************/
diff --git a/dlls/ole32/tests/moniker.c b/dlls/ole32/tests/moniker.c
index 8c533d1ff7..bec5c76caa 100644
--- a/dlls/ole32/tests/moniker.c
+++ b/dlls/ole32/tests/moniker.c
@@ -2625,7 +2625,7 @@ todo_wine
static void test_pointer_moniker(void)
{
- IMoniker *moniker, *inverse;
+ IMoniker *moniker, *moniker2, *prefix, *inverse;
IEnumMoniker *enummoniker;
HRESULT hr;
DWORD moniker_type;
@@ -2748,6 +2748,45 @@ todo_wine
ok(hr == E_NOTIMPL, "Unexpected hr %#x.\n", hr);
IMoniker_Release(moniker);
+
+ /* CommonPrefixWith() */
+ hr = CreatePointerMoniker((IUnknown *)&Test_ClassFactory, &moniker);
+ ok(hr == S_OK, "Failed to create moniker, hr %#x.\n", hr);
+
+ hr = CreatePointerMoniker((IUnknown *)&Test_ClassFactory, &moniker2);
+ ok(hr == S_OK, "Failed to create moniker, hr %#x.\n", hr);
+
+ hr = IMoniker_IsEqual(moniker, NULL);
+ ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+
+ hr = IMoniker_IsEqual(moniker, moniker2);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+ hr = IMoniker_CommonPrefixWith(moniker, moniker2, NULL);
+ ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+
+ hr = IMoniker_CommonPrefixWith(moniker, NULL, &prefix);
+ ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+
+ hr = IMoniker_CommonPrefixWith(moniker, moniker2, &prefix);
+ ok(hr == MK_S_US, "Unexpected hr %#x.\n", hr);
+ ok(prefix == moniker, "Unexpected pointer.\n");
+ IMoniker_Release(prefix);
+
+ IMoniker_Release(moniker2);
+
+ hr = CreatePointerMoniker((IUnknown *)moniker, &moniker2);
+ ok(hr == S_OK, "Failed to create moniker, hr %#x.\n", hr);
+
+ hr = IMoniker_IsEqual(moniker, moniker2);
+ ok(hr == S_FALSE, "Unexpected hr %#x.\n", hr);
+
+ hr = IMoniker_CommonPrefixWith(moniker, moniker2, &prefix);
+ ok(hr == MK_E_NOPREFIX, "Unexpected hr %#x.\n", hr);
+
+ IMoniker_Release(moniker2);
+
+ IMoniker_Release(moniker);
}
static void test_bind_context(void)
--
2.24.1