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