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

?
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top