C ++无法使Async DragDrop正常运行

时间:2015-02-17 08:22:40

标签: c++ com idataobject iasyncoperation oledragdrop

我们的系统目前有一个Silverlight UI(我们无法在这个阶段改变),它具有非常有限的拖放功能。我们目前的浏览器耗尽了信任度。因此,为了处理Silverlight的缺点,我创建了一个c ++ com库来处理Drag Drop事件。这非常适用于来自其他应用程序的传入事件,但是我正在努力获取Drag操作,我们的应用程序作为源,正常工作。要从应用程序拖动的大多数文件都是虚拟的,我已经设法使其工作,但无论我尝试过的所有内容我都无法使操作异步,并且应用程序在过程

我最初只实现了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。

非常感谢任何反馈。

0 个答案:

没有答案