Alfred Agrell (@Alcaro) commented about dlls/shell32/shellord.c:
LPDWORD pdwEffect) { FIXME("(%p %p %p 0x%08lx %p):stub.\n", - hWnd, lpDataObject, lpDropSource, dwOKEffect, pdwEffect); - return DoDragDrop(lpDataObject, lpDropSource, dwOKEffect, pdwEffect); + hWnd, lpDataObject, lpDropSource, dwOKEffect, pdwEffect); + if(lpDropSource == NULL) + { + /*Windows Vista or Above expect this function to create a IDropSource object if none was provided. Delphi Windows Vista drag and drop routines actually expect this to work */ + IDummySource* dummy = calloc(1, sizeof(IDummySource)); + if(dummy){ + dummy->IDropSource_iface.lpVtbl = &dropsourcevtbl; + dummy->Ref = 1; + lpDropSource = &dummy->IDropSource_iface; I'm not seeing where that object is freed. Am I missing something, or is this a memory leak?
And this should probably return E_OUTOFMEMORY, not call DoDragDrop with bogus arguments. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/8063#note_103644