ole32/ole2: Don't call IDropTarget::QueryInterface() in RegisterDragDrop(). (try 5)
Jacek Caban
jacek at codeweavers.com
Mon Jun 6 11:43:10 CDT 2011
On 06/06/11 18:33, Adam Martinson wrote:
>
> This is to work around apps which break COM rules by not implementing
> IDropTarget::QueryInterface(). Windows doesn't expose this because it
> doesn't call CoMarshallInterface() in RegisterDragDrop().
>
> Fixes bug 23861.
> ---
> dlls/ole32/ole2.c | 127
> ++++++++++++++++++++++++++++++++++++++++---
> dlls/ole32/tests/dragdrop.c | 2 +-
> 2 files changed, 119 insertions(+), 10 deletions(-)
>
+static ULONG WINAPI DropTargetWrapper_AddRef(IDropTarget* iface)
+{
+ DropTargetWrapper* This = wrapper_from_IDropTarget(iface);
+ InterlockedIncrement(&This->refs);
+ return IDropTarget_AddRef(This->inner);
+}
+
+static ULONG WINAPI DropTargetWrapper_Release(IDropTarget* iface)
+{
+ DropTargetWrapper* This = wrapper_from_IDropTarget(iface);
+ LONG outer_refs = InterlockedDecrement(&This->refs);
+ ULONG inner_refs = IDropTarget_Release(This->inner);
+ if (!outer_refs)
+ HeapFree(GetProcessHeap(), 0, This);
+ return inner_refs;
+}
This looks very questionable, it breaks COM ref-count rules.
Jacek
More information about the wine-patches
mailing list