From 021d738ef0dabfd817666189eef98853889397f2 Mon Sep 17 00:00:00 2001 From: Max Katz Date: Thu, 3 Feb 2022 02:58:37 -0500 Subject: [PATCH] Use TryUnwrapManagedObject in drag'n'drop --- src/Avalonia.MicroCom/MicroComProxyBase.cs | 16 ---------------- src/Windows/Avalonia.Win32/DataObject.cs | 19 +++++-------------- src/Windows/Avalonia.Win32/Win32Com/win32.idl | 5 ----- 3 files changed, 5 insertions(+), 35 deletions(-) diff --git a/src/Avalonia.MicroCom/MicroComProxyBase.cs b/src/Avalonia.MicroCom/MicroComProxyBase.cs index b707b50643..140af3e4ef 100644 --- a/src/Avalonia.MicroCom/MicroComProxyBase.cs +++ b/src/Avalonia.MicroCom/MicroComProxyBase.cs @@ -61,22 +61,6 @@ namespace Avalonia.MicroCom throw new COMException("QueryInterface failed", rv); } - public bool TryQueryInterface(out T result) where T : IUnknown - { - var guid = MicroComRuntime.GetGuidFor(typeof(T)); - var rv = QueryInterface(guid, out var ppv); - if (rv == 0) - { - result = (T)MicroComRuntime.CreateProxyFor(typeof(T), ppv, true); - return true; - } - else - { - result = default; - return false; - } - } - public bool IsDisposed => _nativePointer == IntPtr.Zero; protected virtual void Dispose(bool disposing) diff --git a/src/Windows/Avalonia.Win32/DataObject.cs b/src/Windows/Avalonia.Win32/DataObject.cs index 69ef3d5e76..af11381ae2 100644 --- a/src/Windows/Avalonia.Win32/DataObject.cs +++ b/src/Windows/Avalonia.Win32/DataObject.cs @@ -31,25 +31,16 @@ namespace Avalonia.Win32 return disposableDataObject; } - // If DataObject was created on the our side (drag'n'drop initiated by Avalonia), - // then pDataObj will implement IAvnDataObject interface as well. So we can safely case it back to DataObject. - if (((MicroComProxyBase)pDataObj).TryQueryInterface(out var avnInterface)) + var dataObject = MicroComRuntime.TryUnwrapManagedObject(pDataObj) as DataObject; + if (dataObject is not null) { - using (avnInterface) - { - var ppv = MicroComRuntime.GetNativeIntPtr(avnInterface); - return MicroComRuntime.GetObjectFromCcw(ppv) as DataObject; - } - } - // Otherwise wrap pDataObj into OleDataObject. - else - { - return new OleDataObject(pDataObj); + return dataObject; } + return new OleDataObject(pDataObj); } } - internal class DataObject : CallbackBase, IDisposableDataObject, Win32Com.IAvnDataObject + internal class DataObject : CallbackBase, IDisposableDataObject, Win32Com.IDataObject { // Compatibility with WinForms + WPF... internal static readonly byte[] SerializedObjectGUID = new Guid("FD9EA796-3B13-4370-A679-56106BB288FB").ToByteArray(); diff --git a/src/Windows/Avalonia.Win32/Win32Com/win32.idl b/src/Windows/Avalonia.Win32/Win32Com/win32.idl index 8a1941b4fd..afb3a652a0 100644 --- a/src/Windows/Avalonia.Win32/Win32Com/win32.idl +++ b/src/Windows/Avalonia.Win32/Win32Com/win32.idl @@ -267,11 +267,6 @@ interface IDataObject : IUnknown [out] void** ppenumAdvise); } -[uuid(3d74307e-12be-460a-b098-4dd320eec7d5)] -interface IAvnDataObject : IDataObject -{ -} - [ local, object,