0

我们目前的系统有一个 Silverlight UI(我们现阶段无法更改),它的拖放功能非常有限。我们目前的浏览器信任度提高了。因此,为了处理 Silverlight 的缺点,我创建了一个 c++ com 库来处理拖放事件。这对于来自其他应用程序的传入事件非常有效,但是我正在努力以我们的应用程序为源来获得拖动操作,使其正常工作。要从应用程序中拖动的大多数文件都是虚拟的,我已经设法开始工作,但是无论我尝试过什么,我都无法使操作异步,并且应用程序在此过程中锁定。

我最初只实现了 IAsyncOperation(需要向后兼容 xp),它没有明显的影响。我的 DataObject 被查询接口,获取 ref。调用 GetAsyncMode,返回 VARIANT_TRUE,然后调用 StartOperation。但是,所有操作都在同一个线程(ui 线程)上完成,并且似乎没有异步受到影响。

我随后尝试实现 ICallFactory 以返回 AsyncIDataObject。这里 explorer 似乎检查了 ICallFactory 接口,在调用对象上调用 CreateCall 并查询它以确保它具有正确的接口。使用符号服务器,我可以看到它发生在 AsyncStubInvoke 调用堆栈中。从这里调用 StdStubBuffer_QueryInterface 正在搜索 ICallFactory 接口。这个检查失败了,很遗憾我看不到这个接口正在检查什么对象。在此失败后,调用似乎在操作不支持错误(继接口不支持错误之后)后回退到 SyncStubInvoke。所有这些似乎也对最终结果没有影响,并且调用显然仍然与源应用程序锁定同步。

公开 com 调用的 DragDrop 类是 CComMultiThreadModel。我尝试使用我的 DataObject 作为不从 CComObjectRootEx 继承的基本类和在 IDL 中定义的包装器 IDataObject 类,并且确实从 CComObjectRootEx 继承,CComMultiThreadModel 也是如此。我也尝试过让这个类从 IDispatch 和 IUnknown 继承。

任何反馈将不胜感激。

4

0 回答 0