ole32: Fix IsEqual() for antimoniker.

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Nikolay Sivov 2020-01-24 12:21:29 +03:00 committed by Alexandre Julliard
parent b9ce037abb
commit 9a4959de4a
2 changed files with 17 additions and 16 deletions

View File

@ -53,6 +53,7 @@ static inline AntiMonikerImpl *impl_from_IROTData(IROTData *iface)
return CONTAINING_RECORD(iface, AntiMonikerImpl, IROTData_iface); return CONTAINING_RECORD(iface, AntiMonikerImpl, IROTData_iface);
} }
static AntiMonikerImpl *unsafe_impl_from_IMoniker(IMoniker *iface);
/******************************************************************************* /*******************************************************************************
* AntiMoniker_QueryInterface * AntiMoniker_QueryInterface
@ -308,22 +309,20 @@ AntiMonikerImpl_Enum(IMoniker* iface,BOOL fForward, IEnumMoniker** ppenumMoniker
/****************************************************************************** /******************************************************************************
* AntiMoniker_IsEqual * AntiMoniker_IsEqual
******************************************************************************/ ******************************************************************************/
static HRESULT WINAPI static HRESULT WINAPI AntiMonikerImpl_IsEqual(IMoniker *iface, IMoniker *other)
AntiMonikerImpl_IsEqual(IMoniker* iface,IMoniker* pmkOtherMoniker)
{ {
DWORD mkSys; AntiMonikerImpl *moniker = impl_from_IMoniker(iface), *other_moniker;
TRACE("(%p,%p)\n",iface,pmkOtherMoniker); TRACE("%p, %p.\n", iface, other);
if (pmkOtherMoniker==NULL) if (!other)
return E_INVALIDARG;
other_moniker = unsafe_impl_from_IMoniker(other);
if (!other_moniker)
return S_FALSE; return S_FALSE;
IMoniker_IsSystemMoniker(pmkOtherMoniker,&mkSys); return moniker->count == other_moniker->count ? S_OK : S_FALSE;
if (mkSys==MKSYS_ANTIMONIKER)
return S_OK;
else
return S_FALSE;
} }
/****************************************************************************** /******************************************************************************
@ -588,6 +587,13 @@ static const IMonikerVtbl VT_AntiMonikerImpl =
AntiMonikerImpl_IsSystemMoniker AntiMonikerImpl_IsSystemMoniker
}; };
static AntiMonikerImpl *unsafe_impl_from_IMoniker(IMoniker *iface)
{
if (iface->lpVtbl != &VT_AntiMonikerImpl)
return NULL;
return CONTAINING_RECORD(iface, AntiMonikerImpl, IMoniker_iface);
}
/********************************************************************************/ /********************************************************************************/
/* Virtual function table for the IROTData class. */ /* Virtual function table for the IROTData class. */
static const IROTDataVtbl VT_ROTDataImpl = static const IROTDataVtbl VT_ROTDataImpl =

View File

@ -2331,11 +2331,9 @@ todo_wine
ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
hr = IMoniker_IsEqual(moniker, moniker2); hr = IMoniker_IsEqual(moniker, moniker2);
todo_wine
ok(hr == S_FALSE, "Unexpected hr %#x.\n", hr); ok(hr == S_FALSE, "Unexpected hr %#x.\n", hr);
hr = IMoniker_IsEqual(moniker2, moniker); hr = IMoniker_IsEqual(moniker2, moniker);
todo_wine
ok(hr == S_FALSE, "Unexpected hr %#x.\n", hr); ok(hr == S_FALSE, "Unexpected hr %#x.\n", hr);
hr = IMoniker_Hash(moniker, &hash); hr = IMoniker_Hash(moniker, &hash);
@ -2374,11 +2372,9 @@ todo_wine
ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
hr = IMoniker_IsEqual(moniker, moniker2); hr = IMoniker_IsEqual(moniker, moniker2);
todo_wine
ok(hr == S_FALSE, "Unexpected hr %#x.\n", hr); ok(hr == S_FALSE, "Unexpected hr %#x.\n", hr);
hr = IMoniker_IsEqual(moniker2, moniker); hr = IMoniker_IsEqual(moniker2, moniker);
todo_wine
ok(hr == S_FALSE, "Unexpected hr %#x.\n", hr); ok(hr == S_FALSE, "Unexpected hr %#x.\n", hr);
hr = IMoniker_Hash(moniker, &hash); hr = IMoniker_Hash(moniker, &hash);
@ -2403,7 +2399,6 @@ todo_wine
ok(hr == S_OK, "Unexpected hr %#x.\n", hr); ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
hr = IMoniker_IsEqual(moniker, NULL); hr = IMoniker_IsEqual(moniker, NULL);
todo_wine
ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
IStream_Release(stream); IStream_Release(stream);