Pregunta

He estado trabajando en lo que parece ser una funcionalidad simple por demasiado tiempo ahora. La idea es que tengo una aplicación con un TreeView. Esta vista de árbol representa contenido de una base de datos organizados en los archivos y carpetas, al igual que el Explorador de Windows. Así que tiene sentido que el usuario debe ser capaz de arrastrar los archivos / carpetas fuera de mi aplicación y en el Explorador de Windows.

decidí que debería utilizar un IStream si se arrastra un archivo o un IStorage si arrastra una carpeta. Después de un tiempo muy largo y aprender mucho más de lo que quería saber sobre Win32 / COM (y un empujón de una persona muy útil en este caso), por fin tengo que IStream o IStorage creadas.

Entonces me encontré con que al pasar esta IStream o IStorage fuera al Explorador de Windows, que tenía que conseguir que en un STGMEDIUM. Por supuesto, los medium.tymed serán bien IStream o IStorage, dependiendo de lo que estoy usando, pero según entiendo la medium.unionmember debe ser un puntero a la IStream/IStorage.

He intentado usar la palabra clave fija (pero no es blittable, por supuesto), lo he intentado simplemente convertir la maldita cosa a una matriz de bytes, pero no puedo encontrar una manera de que esto suceda, yo 'he intentado usar GCHandle a la clavija (pero todavía no es blittable), y varias otras cosas que no funcionaron.

Así que mi pregunta es la siguiente: Dado IStorage s y STGMEDIUM m, ¿cómo lo pueblan m.unionmember de manera que el Explorador de Windows será feliz y aceptar la caída

?
¿Fue útil?

Solución

sindicatos

Normalmente, C se representan utilizando StructLayout.Explicit en C #. Esto probablemente no funcionará en su caso, sin embargo - mientras que se puede superponer IStream y IStorage referencias como esa, el contador de referencias intentará reunir ambos. Su mejor apuesta es probablemente acaba de declarar el campo como IntPtr en su declaración de STGMEDIUM, y utilizar Marshal.GetIUnknownForObject inicializarlo.

Otros consejos

Creo que el tema no está actualizado por mucho tiempo, sin embargo, cualquier persona que busca un lastre y soltar archivos echa un vistazo a esta discusión y, especialmente, el puesto de dbirdz: http://www.daniweb.com/forums/thread166429.html

En mis ojos esto incluso se aplicaría a esta aplicación, yo trataba de escribir mi corriente en un archivo temporal que luego podría ser trasladada a su ubicación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top