Drag and drop da C # a Windows Explorer con IStorage / IStream
-
16-09-2019 - |
Domanda
Ho lavorato su quello che suona come semplice funzionalità per troppo tempo ormai. L'idea è che ho un'applicazione con un TreeView. Questa vista ad albero rappresenta contenuto di una banca dati organizzati in file e cartelle, molto simile a Esplora risorse di Windows. Quindi ha senso che l'utente dovrebbe essere in grado di trascinare i file / cartelle dalla mia app e in Windows Explorer.
ho deciso che avrei dovuto usare un IStream
se trascinare un file o di un IStorage
se si trascina una cartella. Dopo un tempo molto lungo e di apprendimento molto più di quanto io abbia mai voluto sapere su Win32 / COM (e una gomitata da una persona molto disponibile qui), ho finalmente che IStream
o IStorage
creato.
Poi ho scoperto che a passare questo IStream
o IStorage
off a Windows Explorer, ho dovuto farlo in un STGMEDIUM
. Naturalmente, i medium.tymed sarà o IStream
o IStorage
, a seconda di quale sto usando, ma se ho capito bene il medium.unionmember
deve essere un puntatore alla IStream/IStorage
.
Ho provato con la parola chiave fissa (ma non è copiabili, ovviamente), ho provato una semplice conversione la cosa Blasted ad un array di byte, ma non riesco a trovare un modo per realizzare questo obiettivo, io 'Ho provato ad utilizzare GCHandle al pin (ma ancora non è copiabili), e diverse altre cose che non hanno funzionato.
Quindi la mia domanda è questa: IStorage s
Given e STGMEDIUM m
, come faccio io popolo m.unionmember
in modo che Windows Explorer sarà felice e accettare il rilascio
Soluzione
In genere, C sindacati sono rappresentati utilizzando StructLayout.Explicit
in C #. Questo probabilmente non funzionerà nel tuo caso, tuttavia - mentre è possibile sovrapporre IStream
e IStorage
riferimenti del genere, il marshaller cercherà di maresciallo entrambi. La cosa migliore è probabilmente di dichiarare solo il campo come IntPtr
nella vostra dichiarazione di STGMEDIUM
, e utilizzare Marshal.GetIUnknownForObject
inizializzare.
Altri suggerimenti
Credo che il tema è superata da tempo, ma tutti coloro che cercano un file drag and drop verificare questa discussione e, soprattutto, la carica di dbirdz: http://www.daniweb.com/forums/thread166429.html
Ai miei occhi questo sarebbe nemmeno si applicano a questa applicazione, mi piacerebbe provare a scrivere il mio flusso in un file temporaneo che potrebbe poi essere trasferito nella sua sede.