http://bugs.winehq.org/show_bug.cgi?id=7949
------- Additional Comments From focht@gmx.net 2007-25-04 04:56 ------- Hello,
--- quote --- Could you please provide +relay,+atl log? --- quote ---
Not necessary, already found it. Caused by a bug in wine ATL AtlInternalQueryInterface() implementation.
Getting a patch from following information into git is left to you :)
--- snip dlls/atl/atl_main.c --- HRESULT WINAPI AtlInternalQueryInterface(void* this, const _ATL_INTMAP_ENTRY* pEntries, REFIID iid, void** ppvObject) { int i = 0; HRESULT rc = E_NOINTERFACE; TRACE("(%p, %p, %p, %p)\n",this, pEntries, iid, ppvObject);
if (IsEqualGUID(iid,&IID_IUnknown)) { TRACE("Returning IUnknown\n"); *ppvObject = this; IUnknown_AddRef((IUnknown*)this); return S_OK; } .... --- snip dlls/atl/atl_main.c ---
The code to get the first interface (e.g. client says "give me IUnknown") is wrong. And you should really validate [out] param...
--- snip dlls/atl/atl_main.c --- HRESULT WINAPI AtlInternalQueryInterface(void* this, const _ATL_INTMAP_ENTRY* pEntries, REFIID iid, void** ppvObject) { int i = 0; HRESULT rc = E_NOINTERFACE;
TRACE("(%p, %p, %p, %p)\n",this, pEntries, iid, ppvObject);
if (ppvObject == NULL) return E_POINTER;
*ppvObject = NULL;
/* first interface (IUnknown) requested by client? */ if (IsEqualGUID(iid,&IID_IUnknown)) { TRACE("Returning IUnknown\n");
*ppvObject = (IUnknown*)((int)this+pEntries->dw); IUnknown_AddRef((IUnknown*)*ppvObject);
return S_OK; } ... --- snip dlls/atl/atl_main.c ---
Now it works as expected. Though the software crashes later (due to other issues).
Regards