Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/ole32/compositemoniker.c | 14 ++++---
dlls/ole32/tests/moniker.c | 79 ++++++++++++++++++++++++++++++++++-
2 files changed, 85 insertions(+), 8 deletions(-)
diff --git a/dlls/ole32/compositemoniker.c b/dlls/ole32/compositemoniker.c
index 4451f0daae6..77e1e8aff35 100644
--- a/dlls/ole32/compositemoniker.c
+++ b/dlls/ole32/compositemoniker.c
@@ -1023,17 +1023,19 @@ static HRESULT WINAPI CompositeMonikerImpl_GetDisplayName(IMoniker *iface, IBind
{
CompositeMonikerImpl *moniker = impl_from_IMoniker(iface);
WCHAR *left_name = NULL, *right_name = NULL;
+ HRESULT hr;
TRACE("%p, %p, %p, %p\n", iface, pbc, pmkToLeft, displayname);
- if (!displayname)
- return E_POINTER;
-
- if (!moniker->comp_count)
+ if (!pbc || !displayname || !moniker->comp_count)
return E_INVALIDARG;
- IMoniker_GetDisplayName(moniker->left, pbc, NULL, &left_name);
- IMoniker_GetDisplayName(moniker->right, pbc, NULL, &right_name);
+ if (FAILED(hr = IMoniker_GetDisplayName(moniker->left, pbc, NULL, &left_name))) return hr;
+ if (FAILED(hr = IMoniker_GetDisplayName(moniker->right, pbc, NULL, &right_name)))
+ {
+ CoTaskMemFree(left_name);
+ return hr;
+ }
if (!(*displayname = CoTaskMemAlloc((lstrlenW(left_name) + lstrlenW(right_name) + 1) * sizeof(WCHAR))))
{
diff --git a/dlls/ole32/tests/moniker.c b/dlls/ole32/tests/moniker.c
index 795d8750d05..fcd8dd8310d 100644
--- a/dlls/ole32/tests/moniker.c
+++ b/dlls/ole32/tests/moniker.c
@@ -145,6 +145,38 @@ static IMoniker *create_antimoniker(DWORD level)
return moniker;
}
+static HRESULT WINAPI pointer_moniker_obj_QueryInterface(IUnknown *iface,
+ REFIID riid, void **obj)
+{
+ if (IsEqualIID(riid, &IID_IUnknown))
+ {
+ *obj = iface;
+ return S_OK;
+ }
+
+ *obj = NULL;
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI pointer_moniker_obj_AddRef(IUnknown *iface)
+{
+ return 2;
+}
+
+static ULONG WINAPI pointer_moniker_obj_Release(IUnknown *iface)
+{
+ return 1;
+}
+
+static const IUnknownVtbl pointer_moniker_obj_vtbl =
+{
+ pointer_moniker_obj_QueryInterface,
+ pointer_moniker_obj_AddRef,
+ pointer_moniker_obj_Release,
+};
+
+static IUnknown pm_obj = { &pointer_moniker_obj_vtbl };
+
static HRESULT create_moniker_parse_desc(const char *desc, unsigned int *eaten,
IMoniker **moniker)
{
@@ -163,6 +195,9 @@ static HRESULT create_moniker_parse_desc(const char *desc, unsigned int *eaten,
*eaten = 2;
*moniker = create_antimoniker(desc[1] - '0');
return S_OK;
+ case 'P':
+ *eaten = 1;
+ return CreatePointerMoniker(&pm_obj, moniker);
case 'C':
*eaten = 1;
desc++;
@@ -860,7 +895,7 @@ static void test_ROT(void)
'1','9','0','3','-','4','A','A','E','-','B','1','A','F','-',
'2','0','4','6','E','5','8','6','C','9','2','5',0};
HRESULT hr;
- IMoniker *pMoniker = NULL;
+ IMoniker *pMoniker = NULL, *moniker;
struct test_moniker *test_moniker;
IRunningObjectTable *pROT = NULL;
struct test_factory factory;
@@ -988,6 +1023,25 @@ static void test_ROT(void)
IMoniker_Release(pMoniker);
IMoniker_Release(&test_moniker->IMoniker_iface);
+ /* Pointer moniker does not implement IROTData or display name */
+ hr = CreatePointerMoniker(NULL, &pMoniker);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+ hr = IRunningObjectTable_Register(pROT, ROTFLAGS_REGISTRATIONKEEPSALIVE, (IUnknown *)&factory.IClassFactory_iface,
+ pMoniker, &dwCookie);
+todo_wine
+ ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+ IMoniker_Release(pMoniker);
+
+ hr = create_moniker_from_desc("I1", &moniker);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+ hr = CreatePointerMoniker((IUnknown *)moniker, &pMoniker);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+ hr = IRunningObjectTable_Register(pROT, ROTFLAGS_REGISTRATIONKEEPSALIVE, (IUnknown *)&factory.IClassFactory_iface,
+ pMoniker, &dwCookie);
+ ok(hr == E_NOTIMPL, "Unexpected hr %#x.\n", hr);
+ IMoniker_Release(pMoniker);
+ IMoniker_Release(moniker);
+
IRunningObjectTable_Release(pROT);
}
@@ -3537,6 +3591,23 @@ todo_wine
IMoniker_Release(&m->IMoniker_iface);
IMoniker_Release(&m2->IMoniker_iface);
+ /* Display name */
+
+ /* One component does not support it. */
+ hr = create_moniker_from_desc("CPI1", &moniker);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+ hr = IMoniker_GetDisplayName(moniker, NULL, NULL, &str);
+ ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+
+ hr = IMoniker_GetDisplayName(moniker, bindctx, NULL, NULL);
+ ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+
+ hr = IMoniker_GetDisplayName(moniker, bindctx, NULL, &str);
+ ok(hr == E_NOTIMPL, "Unexpected hr %#x.\n", hr);
+
+ IMoniker_Release(moniker);
+
IBindCtx_Release(bindctx);
}
@@ -3616,7 +3687,11 @@ todo_wine
ok_ole_success(hr, CreateBindCtx);
hr = IMoniker_GetDisplayName(moniker, bindctx, NULL, &display_name);
- ok(hr == E_NOTIMPL, "IMoniker_GetDisplayName should have returned E_NOTIMPL instead of 0x%08x\n", hr);
+ ok(hr == E_NOTIMPL, "Unexpected hr %#x.\n", hr);
+
+ hr = IMoniker_GetDisplayName(moniker, NULL, NULL, &display_name);
+todo_wine
+ ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
IBindCtx_Release(bindctx);
--
2.33.0