IStorage / IStreamの持つC#からWindowsエクスプローラにドラッグ&ドロップ
-
16-09-2019 - |
質問
私は今、あまりにも長い道のりのためのシンプルな機能のように聞こえるものに取り組んできました。アイデアは私がツリービューを使用してアプリケーションを持っているということです。このツリービューは、多くのWindowsエクスプローラのように、ファイルやフォルダに整理するデータベースの内容を表しています。だから、ユーザーが自分のアプリケーションのうち、およびWindows Explorerにこれらのファイル/フォルダをドラッグすることができるはずという意味になります。
私は、彼らがフォルダをドラッグすると、彼らは、ファイルまたはIStream
をドラッグする場合、私はIStorage
を使用することを決めました。非常に長い時間と私が今までのWin32 / COM(と、ここで非常に参考人からナッジ)について知りたいと思ったよりも方法の詳細を学んだ後、私は最終的にそのIStream
またはIStorage
が作成しています。
それから私は私がIStream
でそれを取得しなければならなかった、このIStorage
を渡すか、またはWindowsエクスプローラにオフSTGMEDIUM
することを発見しました。もちろん、medium.tymedは、私が使用しているかに応じて、IStream
またはIStorage
のいずれかになりますが、私はそれを理解するようmedium.unionmember
がIStream/IStorage
へのポインタである必要があります。
私は、私は、(それはもちろん、blittable型ではありません)、私はバイト配列にブラスト事を変換しようとした固定キーワードを使用して試してみたが、それを実現するために方法を考え出すことはできませんそれ(それはまだblittable型ではない)、そして動作しませんでしたいくつかの他のものをピンにGCHandleを使用してみました」VEの。
Windowsエクスプローラが幸せになるとドロップを受け入れるように、私はIStorage s
を移入ないか、考えるSTGMEDIUM m
とm.unionmember
だから私の質問はこれです?
解決
通常、C組合は、C#でStructLayout.Explicit
を使用して表現されています。これはおそらく、しかし、あなたのケースでは動作しません - あなたがそのようなIStream
とIStorage
参照をオーバーレイすることができながら、マーシャラーは両方をマーシャリングしようとします。あなたの最善の策は、ちょうどIntPtr
のあなたの宣言でSTGMEDIUM
としてフィールドを宣言し、それを初期化するためにMarshal.GetIUnknownForObject
を使用することが考えられます。
他のヒント
私は、トピックは、ファイルのドラッグを探して長い、しかし誰もが古くなっていると思うし、この議論をチェックアウトドロップとdbirdzの特にポスト:<のhref = "http://www.daniweb.com/forums/thread166429 .htmlを」REL = "nofollowを"> http://www.daniweb.com/forums/thread166429.html の
私の目には、これはでも、このアプリケーションに適用される、私はその場所に移動することができ、一時ファイルに私のストリームを書こうと思います。