On Tue, Sep 26, 2017 at 01:00:08AM +0000, Alistair Leslie-Hughes wrote:
Signed-off-by: Alistair Leslie-Hughes
<leslie_alistair(a)hotmail.com>
---
dlls/ole32/datacache.c | 5 ++++-
dlls/ole32/tests/ole2.c | 10 ++++++++--
2 files changed, 12 insertions(+), 3 deletions(-)
diff --git a/dlls/ole32/datacache.c b/dlls/ole32/datacache.c
index a95d0fb..c563118 100644
--- a/dlls/ole32/datacache.c
+++ b/dlls/ole32/datacache.c
@@ -2760,7 +2760,10 @@ HRESULT WINAPI CreateDataCache(
if (newCache == 0)
return E_OUTOFMEMORY;
- hr = IUnknown_QueryInterface(&newCache->IUnknown_inner, riid, ppvObj);
+ if ( !pUnkOuter && IsEqualIID(&IID_IUnknown, riid) )
+ hr = IUnknown_QueryInterface(&newCache->IUnknown_inner,
&IID_IOleCache2, ppvObj);
+ else
+ hr = IUnknown_QueryInterface(&newCache->IUnknown_inner, riid, ppvObj);
IUnknown_Release(&newCache->IUnknown_inner);
But now if you call QI(IID_IUnknown) on this interface you'll get
back something different, which is wrong. You'll need to do
some more restructing to make this correct.
Btw, is there a bug that depends on this?
diff --git a/dlls/ole32/tests/ole2.c
b/dlls/ole32/tests/ole2.c
index b30f63b..39b161c 100644
--- a/dlls/ole32/tests/ole2.c
+++ b/dlls/ole32/tests/ole2.c
@@ -1575,6 +1575,7 @@ static void test_data_cache(void)
char szSystemDir[MAX_PATH];
WCHAR wszPath[MAX_PATH];
static const WCHAR wszShell32[] =
{'\\','s','h','e','l','l','3','2','.','d','l','l',0};
+ DWORD connection;
static const struct expected_method methods_cacheinitnew[] =
{
@@ -1651,14 +1652,19 @@ static void test_data_cache(void)
ok(hr == S_OK, "got 0x%08x\n", hr);
hr = IUnknown_QueryInterface(unk, &IID_IOleCache2, (void**)&pOleCache);
ok(hr == S_OK, "got 0x%08x\n", hr);
-todo_wine {
ok(unk == (IUnknown*)olecache, "got %p, expected %p\n", olecache, unk);
ok(unk == (IUnknown*)pOleCache, "got %p, expected %p\n", pOleCache, unk);
-}
+
IOleCache2_Release(pOleCache);
IOleCache_Release(olecache);
IUnknown_Release(unk);
+ hr = CreateDataCache(NULL, &CLSID_NULL, &IID_IUnknown,
(void**)&olecache);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ hr = IOleCache_Cache(olecache, &fmtetc, ADVF_PRIMEFIRST | ADVFCACHE_NOHANDLER,
&connection);
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ IOleCache_Release(olecache);
+
A better test would be to call QI(IID_IOleCache) on the returned
IUnknown* and show that it's the same. You could also
QI(IID_IUnknown) to test for my comment above.
Huw.