現在、システムには Silverlight UI (この段階では変更できません) がありますが、ドラッグ ドロップ機能は非常に限られています。現在、信頼を高めたブラウザが不足しています。そこで、Silverlight の欠点を処理するために、ドラッグ ドロップ イベントを処理するために C++ com ライブラリを作成しました。これは、他のアプリケーションからの受信イベントに対しては完全に機能しますが、アプリをソースとしてドラッグ操作を正しく機能させるのに苦労しています。アプリからドラッグされるファイルのほとんどは仮想ファイルになりますが、これはなんとか機能しましたが、試行したすべての操作に関係なく、操作を非同期にすることができず、プロセス中にアプリがロックされました。
最初に実装したのは IAsyncOperation (xp との下位互換性が必要) だけで、明らかな影響はありませんでした。私の DataObject はインターフェースに対して照会され、ref を取得します。VARIANT_TRUE を返す GetAsyncMode への呼び出しが行われ、StartOperation への呼び出しが行われます。ただし、すべての操作は同じスレッド (ui スレッド) で行われ、非同期は影響を受けていないようです。
その後、AsyncIDataObject を返すように ICallFactory を実装しようとしました。ここで、エクスプローラーは ICallFactory インターフェイスをチェックしているようで、呼び出しオブジェクトで CreateCall を呼び出し、クエリを実行して、正しいインターフェイスがあることを確認します。シンボル サーバーを使用すると、これが AsyncStubInvoke コール スタックで発生することがわかります。ここから、ICallFactory インターフェイスを検索する StdStubBuffer_QueryInterface への呼び出しが行われます。このチェックは失敗し、残念ながら、このインターフェイスでどのオブジェクトがチェックされているかを確認できません。これが失敗した後、操作がサポートされていないエラー (インターフェイスがサポートされていないエラーに続く) の後、呼び出しは SyncStubInvoke にフォールバックするようです。これもすべて最終結果に影響を与えないようで、呼び出しはソース アプリのロックと同期しているようです。
com 呼び出しを公開する私の DragDrop クラスは CComMultiThreadModel です。CComObjectRootExから継承しない基本クラスとしてDataObjectを使用しようとしました.IDLでも定義され、CComMultiThreadModelと同様にCComObjectRootExから継承するラッパーIDataObjectクラスを使用してみました。また、このクラスが IDispatch と IUnknown から継承されるようにしました。
どんなフィードバックでも大歓迎です。