diff --git a/dlls/ole32/filemoniker.c b/dlls/ole32/filemoniker.c index d3940a9365f..f52881108c7 100644 --- a/dlls/ole32/filemoniker.c +++ b/dlls/ole32/filemoniker.c @@ -57,6 +57,15 @@ static inline FileMonikerImpl *impl_from_IROTData(IROTData *iface) return CONTAINING_RECORD(iface, FileMonikerImpl, IROTData_iface); } +static const IMonikerVtbl VT_FileMonikerImpl; + +static FileMonikerImpl *unsafe_impl_from_IMoniker(IMoniker *iface) +{ + if (iface->lpVtbl != &VT_FileMonikerImpl) + return NULL; + return CONTAINING_RECORD(iface, FileMonikerImpl, IMoniker_iface); +} + /* Local function used by filemoniker implementation */ static HRESULT FileMonikerImpl_Construct(FileMonikerImpl* iface, LPCOLESTR lpszPathName); @@ -735,40 +744,20 @@ FileMonikerImpl_Enum(IMoniker* iface,BOOL fForward, IEnumMoniker** ppenumMoniker return S_OK; } -/****************************************************************************** - * FileMoniker_IsEqual - */ -static HRESULT WINAPI -FileMonikerImpl_IsEqual(IMoniker* iface,IMoniker* pmkOtherMoniker) +static HRESULT WINAPI FileMonikerImpl_IsEqual(IMoniker *iface, IMoniker *other) { - FileMonikerImpl *This = impl_from_IMoniker(iface); - CLSID clsid; - LPOLESTR filePath; - IBindCtx* bind; - HRESULT res; + FileMonikerImpl *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; - IMoniker_GetClassID(pmkOtherMoniker,&clsid); - - if (!IsEqualCLSID(&clsid,&CLSID_FileMoniker)) - return S_FALSE; - - res = CreateBindCtx(0,&bind); - if (FAILED(res)) return res; - - res = S_FALSE; - if (SUCCEEDED(IMoniker_GetDisplayName(pmkOtherMoniker,bind,NULL,&filePath))) { - if (!lstrcmpiW(filePath, This->filePathName)) - res = S_OK; - CoTaskMemFree(filePath); - } - - IBindCtx_Release(bind); - return res; + return !wcsicmp(moniker->filePathName, other_moniker->filePathName) ? S_OK : S_FALSE; } /****************************************************************************** diff --git a/dlls/ole32/tests/moniker.c b/dlls/ole32/tests/moniker.c index 8d9c0678436..d8d52295ff2 100644 --- a/dlls/ole32/tests/moniker.c +++ b/dlls/ole32/tests/moniker.c @@ -1981,8 +1981,8 @@ static void test_file_monikers(void) {0x20ac, 0x2020, 0x100, 0x101, 0x102, 0x103, 0x104, 0x105, 0x106, 0x107, 0x108, 0x109, 0x10a, 0x10b, 0x10c, 0}, }; WCHAR filename[MAX_PATH], path[MAX_PATH]; + IMoniker *moniker, *moniker2; BIND_OPTS bind_opts; - IMoniker *moniker; IStorage *storage; IBindCtx *bindctx; STATSTG statstg; @@ -2057,6 +2057,22 @@ static void test_file_monikers(void) IMoniker_Release(moniker); DeleteFileW(filename); + + /* IsEqual() */ + hr = CreateFileMoniker(L"test.bmp", &moniker); + ok(hr == S_OK, "Failed to create a moniker, hr %#x.\n", hr); + + hr = CreateFileMoniker(L"TEST.bmp", &moniker2); + ok(hr == S_OK, "Failed to create a moniker, hr %#x.\n", hr); + + hr = IMoniker_IsEqual(moniker, moniker2); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + + hr = IMoniker_IsEqual(moniker, NULL); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); + + IMoniker_Release(moniker2); + IMoniker_Release(moniker); } static void test_item_moniker(void)