В настоящее время у нас есть интерфейс Silverlight (который мы не можем изменить на данном этапе) для нашей системы, который имеет очень ограниченные возможности перетаскивания. В настоящее время у нас заканчивается браузер с повышенным доверием. Поэтому, чтобы устранить недостатки Silverlight, я создал библиотеку c ++ com для обработки событий Drag Drop. Это прекрасно работает для входящих событий из других приложений, однако я изо всех сил пытаюсь заставить операции Drag с нашим приложением в качестве источника работать правильно. Большинство файлов, которые будут перетаскиваться из приложения, будут виртуальными, но мне удалось заставить их работать, однако, несмотря на все, что я пробовал, я не смог сделать операцию асинхронной, и приложение заблокировалось во время процесса.
Первоначально я реализовал только IAsyncOperation (нужна обратная совместимость с xp), который не оказал заметного влияния. Мой DataObject запрашивается для интерфейса, получает ссылку. Выполнен вызов GetAsyncMode, который возвращает VARIANT_TRUE, и сделан вызов StartOperation. Однако все операции выполняются в одном и том же потоке (потоке пользовательского интерфейса), и никакая асинхронность, похоже, не влияет.
Впоследствии я попытался реализовать ICallFactory, чтобы вернуть AsyncIDataObject. Здесь проводник, кажется, проверяет интерфейс ICallFactory, вызывает CreateCall для объекта вызова и запрашивает его, чтобы убедиться, что он имеет правильные интерфейсы. Используя серверы символов, я вижу, что это происходит в стеке вызовов AsyncStubInvoke. Отсюда осуществляется вызов StdStubBuffer_QueryInterface, который ищет интерфейс ICallFactory. Эта проверка не проходит, и я, к сожалению, не вижу, какой объект проверяется для этого интерфейса. После этого происходит сбой вызова, кажется, возвращается к SyncStubInvoke после ошибки «Операция не поддерживается» (ошибка интерфейса не поддерживается). Все это также, похоже, не влияет на конечный результат, и вызов все еще синхронен с блокировкой исходного приложения.
Мой класс DragDrop, который предоставляет вызовы com, это CComMultiThreadModel. Я попытался использовать мой DataObject в качестве базового класса, не наследующего от CComObjectRootEx, и класса-оболочки IDataObject, который также определен в IDL и наследуется от CComObjectRootEx, как и CComMultiThreadModel. Я также пытался иметь этот класс наследовать от IDispatch, а также IUnknown.
Любая обратная связь будет принята с благодарностью.
Задача ещё не решена.