Drag & Drop von C # Windows Explorer mit IStorage / IStream
-
16-09-2019 - |
Frage
Ich habe gearbeitet, was klingt wie einfache Funktionalität für viel zu lange dauern. Die Idee ist, dass ich eine Anwendung mit einem TreeView haben. Diese treeview stellt Inhalte einer Datenbank in Dateien und Ordnern, ähnlich wie Windows Explorer. So macht es Sinn, dass der Benutzer die Dateien / Ordner aus meiner app und in Windows Explorer ziehen kann.
Ich entschied, dass ich sollte einen IStream
verwenden, wenn sie eine Datei oder einen IStorage
ziehen, wenn sie einen Ordner ziehen. Nach einer sehr langen Zeit und das Lernen viel mehr, als ich jemals über Win32 / COM (und einen Schub von einer sehr hilfreich Person hier), wissen wollte, hat ich endlich, dass IStream
oder IStorage
erstellt.
Dann fand ich, dass dieser IStream
passiere oder Windows Explorer IStorage
aus, ich hatte es in einem STGMEDIUM
zu bekommen. Natürlich, ich bin mit, die medium.tymed entweder IStream
oder IStorage
sein, je nachdem, welche aber, wie ich es die medium.unionmember
verstehen ein Zeiger auf die IStream/IStorage
sein muss.
Ich habe versucht, das feste Schlüsselwort (aber es ist nicht blitfähig, natürlich), habe ich versucht, einfach das gestrahlten, was zu einem Byte-Array konvertiert wird, kann aber nicht mit einem Weg, um das zu erreichen, ich habe versucht, mit GCHandle es an Pin (aber es ist noch nicht blitfähig), und einige andere Dinge, die nicht funktionierten.
Also meine Frage ist: Gegeben IStorage s
und STGMEDIUM m
, wie bevölkern ich m.unionmember
so dass Windows Explorer glücklich sein und das Drop akzeptieren
Lösung
Normalerweise C Gewerkschaften verwenden StructLayout.Explicit
in C # dargestellt. Dies wird wahrscheinlich nicht in Ihrem Fall jedoch - während Sie IStream
und IStorage
Referenzen wie das Overlay kann, wird der Einweiser versuchen beide Marschall. Ihre beste Wette ist wahrscheinlich nur das Feld als IntPtr
in Ihrer Erklärung STGMEDIUM
zu erklären, und verwenden Sie Marshal.GetIUnknownForObject
es zu initialisieren.
Andere Tipps
ich glaube, das Thema durch lange veraltet ist, aber alle, die für eine Datei per Drag & Drop diese Diskussion überprüfen und insbesondere den Posten des dbirdz: http://www.daniweb.com/forums/thread166429.html
In meinen Augen wäre dies sogar auf diese Anwendung gilt, würde ich versuchen, meinen Strom in eine temporäre Datei zu schreiben, die dann in seine Position verschoben werden.