Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/ole32/filemoniker.c | 9 ++++----- dlls/ole32/tests/moniker.c | 6 +----- 2 files changed, 5 insertions(+), 10 deletions(-)
diff --git a/dlls/ole32/filemoniker.c b/dlls/ole32/filemoniker.c index 1e945f9a5f..6310a5acd5 100644 --- a/dlls/ole32/filemoniker.c +++ b/dlls/ole32/filemoniker.c @@ -666,7 +666,7 @@ FileMonikerImpl_ComposeWith(IMoniker* iface, IMoniker* pmkRight, static const WCHAR bkSlash[]={'\',0}; IBindCtx *bind=0; int i=0,j=0,lastIdx1=0,lastIdx2=0; - DWORD mkSys; + DWORD mkSys, order;
TRACE("(%p,%p,%d,%p)\n",iface,pmkRight,fOnlyIfNotGeneric,ppmkComposite);
@@ -735,10 +735,9 @@ FileMonikerImpl_ComposeWith(IMoniker* iface, IMoniker* pmkRight,
return res; } - else if(mkSys==MKSYS_ANTIMONIKER){ - - *ppmkComposite=NULL; - return S_OK; + else if (is_anti_moniker(pmkRight, &order)) + { + return order > 1 ? create_anti_moniker(order - 1, ppmkComposite) : S_OK; } else if (fOnlyIfNotGeneric){
diff --git a/dlls/ole32/tests/moniker.c b/dlls/ole32/tests/moniker.c index ea1e5b1933..7b2dfcfe08 100644 --- a/dlls/ole32/tests/moniker.c +++ b/dlls/ole32/tests/moniker.c @@ -1958,16 +1958,12 @@ todo_wine anti = create_antimoniker(2); hr = IMoniker_ComposeWith(moniker1, anti, TRUE, &moniker2); ok(hr == S_OK, "Failed to compose, hr %#x.\n", hr); -todo_wine - ok(!!moniker2, "Unexpected pointer.\n"); -if (moniker2) -{ TEST_MONIKER_TYPE(moniker2, MKSYS_ANTIMONIKER); hr = IMoniker_Hash(moniker2, &hash); ok(hr == S_OK, "Failed to get hash, hr %#x.\n", hr); ok(hash == 0x80000001, "Unexpected hash.\n"); IMoniker_Release(moniker2); -} + IMoniker_Release(anti);
IMoniker_Release(moniker1);
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/ole32/pointermoniker.c | 20 ++++++++------------ dlls/ole32/tests/moniker.c | 3 +++ 2 files changed, 11 insertions(+), 12 deletions(-)
diff --git a/dlls/ole32/pointermoniker.c b/dlls/ole32/pointermoniker.c index a16a56a098..bb578a6f61 100644 --- a/dlls/ole32/pointermoniker.c +++ b/dlls/ole32/pointermoniker.c @@ -58,20 +58,18 @@ static PointerMonikerImpl *impl_from_IMarshal(IMarshal *iface) }
static PointerMonikerImpl *unsafe_impl_from_IMoniker(IMoniker *iface); -static HRESULT WINAPI -PointerMonikerImpl_QueryInterface(IMoniker* iface,REFIID riid,void** ppvObject) + +static HRESULT WINAPI PointerMonikerImpl_QueryInterface(IMoniker *iface, REFIID riid, void **ppvObject) { - PointerMonikerImpl *This = impl_from_IMoniker(iface); + PointerMonikerImpl *moniker = impl_from_IMoniker(iface);
- TRACE("(%p,%s,%p)\n",This,debugstr_guid(riid),ppvObject); + TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), ppvObject);
- if ( (This==0) || (ppvObject==0) ) - return E_INVALIDARG; + if (!ppvObject) + return E_INVALIDARG;
- /* Initialize the return parameter */ *ppvObject = 0;
- /* Compare the riid with the interface IDs implemented by this object.*/ if (IsEqualIID(&IID_IUnknown, riid) || IsEqualIID(&IID_IPersist, riid) || IsEqualIID(&IID_IPersistStream, riid) || @@ -80,13 +78,11 @@ PointerMonikerImpl_QueryInterface(IMoniker* iface,REFIID riid,void** ppvObject) *ppvObject = iface; } else if (IsEqualIID(&IID_IMarshal, riid)) - *ppvObject = &This->IMarshal_iface; + *ppvObject = &moniker->IMarshal_iface;
- /* Check that we obtained an interface.*/ - if ((*ppvObject)==0) + if (!*ppvObject) return E_NOINTERFACE;
- /* always increase the reference count by one when it is successful */ IMoniker_AddRef(iface);
return S_OK; diff --git a/dlls/ole32/tests/moniker.c b/dlls/ole32/tests/moniker.c index 7b2dfcfe08..4c273547cb 100644 --- a/dlls/ole32/tests/moniker.c +++ b/dlls/ole32/tests/moniker.c @@ -2886,6 +2886,9 @@ static void test_pointer_moniker(void) hr = CreatePointerMoniker((IUnknown *)&Test_ClassFactory, &moniker); ok_ole_success(hr, CreatePointerMoniker);
+ hr = IMoniker_QueryInterface(moniker, &IID_IMoniker, NULL); + ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr); + hr = IMoniker_QueryInterface(moniker, &CLSID_PointerMoniker, (void **)&unknown); todo_wine ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/ole32/pointermoniker.c | 9 ++++----- dlls/ole32/tests/moniker.c | 2 -- 2 files changed, 4 insertions(+), 7 deletions(-)
diff --git a/dlls/ole32/pointermoniker.c b/dlls/ole32/pointermoniker.c index bb578a6f61..101fda4e3b 100644 --- a/dlls/ole32/pointermoniker.c +++ b/dlls/ole32/pointermoniker.c @@ -328,17 +328,16 @@ PointerMonikerImpl_ComposeWith(IMoniker* iface, IMoniker* pmkRight, /****************************************************************************** * PointerMoniker_Enum ******************************************************************************/ -static HRESULT WINAPI -PointerMonikerImpl_Enum(IMoniker* iface,BOOL fForward, IEnumMoniker** ppenumMoniker) +static HRESULT WINAPI PointerMonikerImpl_Enum(IMoniker *iface, BOOL fForward, IEnumMoniker **ppenumMoniker) { - TRACE("(%p,%d,%p)\n",iface,fForward,ppenumMoniker); + TRACE("%p, %d, %p.\n", iface, fForward, ppenumMoniker);
- if (ppenumMoniker == NULL) + if (!ppenumMoniker) return E_POINTER;
*ppenumMoniker = NULL;
- return S_OK; + return E_NOTIMPL; }
/****************************************************************************** diff --git a/dlls/ole32/tests/moniker.c b/dlls/ole32/tests/moniker.c index 4c273547cb..7e7d615645 100644 --- a/dlls/ole32/tests/moniker.c +++ b/dlls/ole32/tests/moniker.c @@ -3008,11 +3008,9 @@ todo_wine
/* Enum() */ hr = IMoniker_Enum(moniker, TRUE, &enummoniker); -todo_wine ok(hr == E_NOTIMPL, "Unexpected hr %#x.\n", hr);
hr = IMoniker_Enum(moniker, FALSE, &enummoniker); -todo_wine ok(hr == E_NOTIMPL, "Unexpected hr %#x.\n", hr);
IMoniker_Release(moniker);
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/ole32/pointermoniker.c | 89 +++++++++++++------------------------ 1 file changed, 31 insertions(+), 58 deletions(-)
diff --git a/dlls/ole32/pointermoniker.c b/dlls/ole32/pointermoniker.c index 101fda4e3b..b2f6c2af95 100644 --- a/dlls/ole32/pointermoniker.c +++ b/dlls/ole32/pointermoniker.c @@ -32,6 +32,7 @@ #include "objbase.h" #include "oleidl.h" #include "wine/debug.h" +#include "wine/heap.h" #include "moniker.h"
WINE_DEFAULT_DEBUG_CHANNEL(ole); @@ -42,7 +43,7 @@ typedef struct PointerMonikerImpl IMoniker IMoniker_iface; IMarshal IMarshal_iface;
- LONG ref; /* reference counter for this object */ + LONG refcount;
IUnknown *pObject; } PointerMonikerImpl; @@ -88,40 +89,30 @@ static HRESULT WINAPI PointerMonikerImpl_QueryInterface(IMoniker *iface, REFIID return S_OK; }
-/****************************************************************************** - * PointerMoniker_AddRef - ******************************************************************************/ -static ULONG WINAPI -PointerMonikerImpl_AddRef(IMoniker* iface) +static ULONG WINAPI PointerMonikerImpl_AddRef(IMoniker *iface) { - PointerMonikerImpl *This = impl_from_IMoniker(iface); + PointerMonikerImpl *moniker = impl_from_IMoniker(iface); + ULONG refcount = InterlockedIncrement(&moniker->refcount);
- TRACE("(%p)\n",This); + TRACE("%p, refcount %u.\n", iface, refcount);
- return InterlockedIncrement(&This->ref); + return refcount; }
-/****************************************************************************** - * PointerMoniker_Release - ******************************************************************************/ -static ULONG WINAPI -PointerMonikerImpl_Release(IMoniker* iface) +static ULONG WINAPI PointerMonikerImpl_Release(IMoniker *iface) { - PointerMonikerImpl *This = impl_from_IMoniker(iface); - ULONG ref; - - TRACE("(%p)\n",This); + PointerMonikerImpl *moniker = impl_from_IMoniker(iface); + ULONG refcount = InterlockedDecrement(&moniker->refcount);
- ref = InterlockedDecrement(&This->ref); + TRACE("%p, refcount %u.\n", iface, refcount);
- /* destroy the object if there are no more references on it */ - if (ref == 0) + if (!refcount) { - if (This->pObject) IUnknown_Release(This->pObject); - HeapFree(GetProcessHeap(),0,This); + if (moniker->pObject) IUnknown_Release(moniker->pObject); + heap_free(moniker); }
- return ref; + return refcount; }
/****************************************************************************** @@ -659,52 +650,34 @@ static const IMarshalVtbl pointer_moniker_marshal_vtbl = pointer_moniker_marshal_DisconnectObject };
-/****************************************************************************** - * PointerMoniker_Construct (local function) - *******************************************************************************/ -static void PointerMonikerImpl_Construct(PointerMonikerImpl* This, IUnknown *punk) -{ - TRACE("(%p)\n",This); - - This->IMoniker_iface.lpVtbl = &VT_PointerMonikerImpl; - This->IMarshal_iface.lpVtbl = &pointer_moniker_marshal_vtbl; - This->ref = 1; - if (punk) - IUnknown_AddRef(punk); - This->pObject = punk; -} - /*********************************************************************** * CreatePointerMoniker (OLE32.@) - * - * Creates a moniker which represents a pointer. - * - * PARAMS - * punk [I] Pointer to the object to represent. - * ppmk [O] Address that receives the pointer to the created moniker. - * - * RETURNS - * Success: S_OK. - * Failure: Any HRESULT code. */ -HRESULT WINAPI CreatePointerMoniker(LPUNKNOWN punk, LPMONIKER *ppmk) +HRESULT WINAPI CreatePointerMoniker(IUnknown *object, IMoniker **ret) { - PointerMonikerImpl *This; + PointerMonikerImpl *moniker;
- TRACE("(%p, %p)\n", punk, ppmk); + TRACE("(%p, %p)\n", object, ret);
- if (!ppmk) + if (!ret) return E_INVALIDARG;
- This = HeapAlloc(GetProcessHeap(), 0, sizeof(*This)); - if (!This) + moniker = heap_alloc(sizeof(*moniker)); + if (!moniker) { - *ppmk = NULL; + *ret = NULL; return E_OUTOFMEMORY; }
- PointerMonikerImpl_Construct(This, punk); - *ppmk = &This->IMoniker_iface; + moniker->IMoniker_iface.lpVtbl = &VT_PointerMonikerImpl; + moniker->IMarshal_iface.lpVtbl = &pointer_moniker_marshal_vtbl; + moniker->refcount = 1; + moniker->pObject = object; + if (moniker->pObject) + IUnknown_AddRef(moniker->pObject); + + *ret = &moniker->IMoniker_iface; + return S_OK; }
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/ole32/pointermoniker.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/dlls/ole32/pointermoniker.c b/dlls/ole32/pointermoniker.c index b2f6c2af95..2ece11f53b 100644 --- a/dlls/ole32/pointermoniker.c +++ b/dlls/ole32/pointermoniker.c @@ -699,9 +699,7 @@ HRESULT WINAPI PointerMoniker_CreateInstance(IClassFactory *iface, return hr;
hr = IMoniker_QueryInterface(pMoniker, riid, ppv); - - if (FAILED(hr)) - IMoniker_Release(pMoniker); + IMoniker_Release(pMoniker);
return hr; }
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=64143
Your paranoid android.
=== debian10 (32 bit Chinese:China report) ===
ole32: clipboard.c:1159: Test failed: got 800401d0 clipboard.c:1175: Test failed: got 800401d0 clipboard.c:1182: Test failed: data objects match clipboard.c:1185: Test failed: Failed to clear clipboard, hr 0x800401d0. clipboard.c:1190: Test failed: data objects match clipboard.c:1191: Test failed: data objects match clipboard.c:1201: Test failed: got 800401d0 clipboard.c:1213: Test failed: got 800401d0 clipboard.c:1214: Test failed: GetData not called clipboard.c:1217: Test failed: 1 1 clipboard.c:1224: Test failed: GetData not called clipboard.c:1228: Test failed: 1
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/ole32/antimoniker.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/dlls/ole32/antimoniker.c b/dlls/ole32/antimoniker.c index 6efd4ae853..7abbfc544f 100644 --- a/dlls/ole32/antimoniker.c +++ b/dlls/ole32/antimoniker.c @@ -668,9 +668,7 @@ HRESULT WINAPI AntiMoniker_CreateInstance(IClassFactory *iface, return hr;
hr = IMoniker_QueryInterface(pMoniker, riid, ppv); - - if (FAILED(hr)) - IMoniker_Release(pMoniker); + IMoniker_Release(pMoniker);
return hr; }