2009-08-14 7 views
5

Ho lavorato su ciò che suona come una semplice funzionalità troppo a lungo ora. L'idea è che ho un'applicazione con un TreeView. Questa vista ad albero rappresenta il contenuto di un database organizzato in file e cartelle, proprio come in Esplora risorse. Quindi ha senso che l'utente dovrebbe essere in grado di trascinare quei file/cartelle dalla mia app e in Esplora risorse.Trascinare e rilasciare da C# a Windows Explorer con IStorage/IStream

Ho deciso di utilizzare un IStream se trascina un file o un IStorage se trascina una cartella. Dopo un tempo molto lungo e un modo di apprendimento più di quanto abbia mai voluto sapere su Win32/COM (e una spinta da una persona molto utile qui), finalmente ho creato quello IStream o IStorage.

Poi ho scoperto che di passare questo IStream o IStorage off a Windows Explorer, ho dovuto farlo in un STGMEDIUM. Naturalmente, medium.tymed sarà o IStream o IStorage, a seconda di quale utilizzo, ma, a quanto ho capito, lo medium.unionmember deve essere un puntatore allo IStream/IStorage.

Ho provato a utilizzare la parola chiave fissa (ma non è blittabile, ovviamente), ho provato a convertire la cosa distrutta in un array di byte, ma non riesco a trovare un modo per farlo accadere, Ho provato a utilizzare GCHandle per collegarlo (ma non è ancora blittabile) e molte altre cose che non hanno funzionato.

Quindi la mia domanda è questa: Dato IStorage s e STGMEDIUM m, come faccio a popolare m.unionmember in modo che Windows Explorer sia soddisfatto e accetti il ​​rilascio?

+0

se qualcuno sa di un'implementazione completa di IStream/IStorage per un URL http, si prega di inviare un'altra risposta qui, ci sono alcuni risultati di Google per questo problema. –

+0

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

risposta

2

Normalmente, i sindacati C sono rappresentati utilizzando StructLayout.Explicit in C#. Questo probabilmente non funzionerà nel tuo caso, tuttavia, mentre puoi sovrapporre i riferimenti IStream e IStorage in questo modo, il marshaller tenterà di eseguire il marshalling di entrambi. La soluzione migliore è probabilmente dichiarare il campo come IntPtr nella dichiarazione di STGMEDIUM e utilizzare Marshal.GetIUnknownForObject per inizializzarlo.

+0

Grazie! Non so come mi sia perso GetIUnknownForObject ... Penso che dovrò abbattere e capire veramente cosa Marshall è un giorno ... –

0

Penso che l'argomento è 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 anche applicabile a questa applicazione, ho proverei a scrivere il mio stream in un file temporaneo che potrebbe essere spostato nella sua posizione.