unsafe void Win32Com.IDropTarget.Drop(Win32Com.IDataObject pDataObj, int grfKeyState, UnmanagedMethods.POINT pt, DropEffect *pdwEffect)
        {
            try
            {
                var dispatch = _tl?.Input;
                if (dispatch == null)
                {
                    *pdwEffect = (int)DropEffect.None;
                }

                SetDataObject(pDataObj);

                var args = new RawDragEvent(
                    _dragDevice,
                    RawDragEventType.Drop,
                    _target,
                    GetDragLocation(pt),
                    _currentDrag,
                    ConvertDropEffect(*pdwEffect),
                    ConvertKeyState(grfKeyState)
                    );
                dispatch(args);
                *pdwEffect = ConvertDropEffect(args.Effects);
            }
            finally
            {
                ReleaseDataObject();
            }
        }
        private void SetDataObject(Win32Com.IDataObject pDataObj)
        {
            var newDrag = GetAvaloniaObjectFromCOM(pDataObj);

            if (_currentDrag != newDrag)
            {
                ReleaseDataObject();
                _currentDrag = newDrag;
            }
        }
        public static unsafe IDataObject GetAvaloniaObjectFromCOM(Win32Com.IDataObject pDataObj)
        {
            if (pDataObj is null)
            {
                throw new ArgumentNullException(nameof(pDataObj));
            }
            if (pDataObj is IDataObject disposableDataObject)
            {
                return(disposableDataObject);
            }

            var dataObject = MicroComRuntime.TryUnwrapManagedObject(pDataObj) as DataObject;

            if (dataObject is not null)
            {
                return(dataObject);
            }
            return(new OleDataObject(pDataObj));
        }