Browse Source

Use TryUnwrapManagedObject in drag'n'drop

pull/7506/head
Max Katz 5 years ago
parent
commit
021d738ef0
  1. 16
      src/Avalonia.MicroCom/MicroComProxyBase.cs
  2. 19
      src/Windows/Avalonia.Win32/DataObject.cs
  3. 5
      src/Windows/Avalonia.Win32/Win32Com/win32.idl

16
src/Avalonia.MicroCom/MicroComProxyBase.cs

@ -61,22 +61,6 @@ namespace Avalonia.MicroCom
throw new COMException("QueryInterface failed", rv);
}
public bool TryQueryInterface<T>(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)

19
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<Win32Com.IAvnDataObject>(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();

5
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,

Loading…
Cancel
Save