2009-08-14 14 views
5

Ich habe gerade an etwas gearbeitet, das jetzt einfach zu lang klingt. Die Idee ist, dass ich eine Anwendung mit einem TreeView habe. Diese Baumansicht stellt Inhalte einer Datenbank dar, die in Dateien und Ordnern organisiert sind, ähnlich wie Windows Explorer. Es ist also sinnvoll, dass der Benutzer diese Dateien/Ordner aus meiner App in den Windows Explorer ziehen kann.Drag & Drop von C# nach Windows Explorer mit IStorage/IStream

Ich entschied, dass ich eine IStream verwenden sollte, wenn sie eine Datei oder eine IStorage ziehen, wenn sie einen Ordner ziehen. Nach einer sehr langen Lernzeit und viel mehr als ich jemals über Win32/COM wissen wollte (und ein Anstupsen von einer sehr hilfsbereiten Person hier), habe ich endlich das IStream oder IStorage erstellt.

Dann habe ich festgestellt, dass, um diese IStream oder IStorage aus Windows Explorer zu übergeben, musste ich es in einem STGMEDIUM bekommen. Natürlich wird der medium.typed entweder IStream oder IStorage sein, je nachdem, was ich benutze, aber wie ich es verstehe, muss der medium.unionmember ein Zeiger auf den IStream/IStorage sein.

Ich habe versucht mit dem festen Schlüsselwort (aber es ist natürlich nicht blitable), ich habe versucht, nur die gestrandeten Sache in eine Byte-Array konvertieren, aber kann nicht mit einer Möglichkeit, das passieren, Ich habe versucht, GCHandle zu verwenden, um es festzuhalten (aber es ist immer noch nicht blitable), und einige andere Dinge, die nicht funktionierten.

Also meine Frage ist das: Gegeben IStorage s und STGMEDIUM m, wie bevölkere ich m.unionmember, so dass Windows Explorer wird glücklich sein und den Tropfen akzeptieren?

+0

Wenn jemand eine vollständige Implementierung von IStream/IStorage für eine http URL weiß, bitte posten Sie eine andere Antwort hier, es gibt einige Google-Ergebnisse für dieses Problem. –

+0

http://stackoverflow.com/questions/3168145/download-a-file-using-windows-istream –

Antwort

2

Normalerweise werden C-Verbindungen mit StructLayout.Explicit in C# dargestellt. Dies wird jedoch in Ihrem Fall wahrscheinlich nicht funktionieren - während Sie IStream und IStorage Referenzen wie diese überlagern können, wird der Marshaller versuchen, beide zu marshallen. Ihre beste Wette ist wahrscheinlich, das Feld einfach als IntPtr in Ihrer Deklaration von STGMEDIUM zu deklarieren und Marshal.GetIUnknownForObject zu verwenden, um es zu initialisieren.

+0

Danke! Ich weiß nicht, wie ich GetIUnknownForObject vermisst habe ... Ich denke, ich muss zusammenbrechen und herausfinden, was Marshalling eines Tages ist ... –

0

ich glaube, das Thema durch lange veraltet ist, sucht aber jemand 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 diese auch auf diese Anwendung gelten würde, ich Ich würde versuchen, meinen Stream in eine temporäre Datei zu schreiben, die dann an seinen Speicherort verschoben werden könnte.