2009-08-14 3 views
5

Je travaille sur ce qui semble être une simple fonctionnalité depuis trop longtemps maintenant. L'idée est que j'ai une application avec un TreeView. Cette arborescence représente le contenu d'une base de données organisée en fichiers et dossiers, un peu comme l'explorateur Windows. Il est donc logique que l'utilisateur devrait être capable de faire glisser ces fichiers/dossiers hors de mon application et dans l'Explorateur Windows.Faites glisser et déposez de C# vers Windows Explorer avec IStorage/IStream

J'ai décidé que je devrais utiliser un IStream s'ils font glisser un fichier ou un IStorage s'ils font glisser un dossier. Après un temps très long et apprentissage plus que jamais je voulais savoir sur Win32/COM (et un coup de pouce d'une personne très utile ici), j'ai enfin créé IStream ou IStorage créé.

Ensuite, j'ai trouvé que pour passer ce IStream ou IStorage à Windows Explorer, je devais l'obtenir dans un STGMEDIUM. Bien sûr, le medium.tymed sera IStream ou IStorage, en fonction de ce que j'utilise, mais si je comprends bien le medium.unionmember doit être un pointeur sur le IStream/IStorage. J'ai essayé d'utiliser le mot-clé fixed (mais ce n'est pas blablable, bien sûr), j'ai juste essayé de convertir la chose blasted en un tableau d'octets, mais je ne peux pas trouver un moyen d'y arriver, J'ai essayé d'utiliser GCHandle pour l'épingler (mais il n'est toujours pas blittable), et plusieurs autres choses qui n'ont pas fonctionné.

Donc ma question est la suivante: donné IStorage s et STGMEDIUM m, comment puis-je remplir m.unionmember de sorte que Windows Explorer sera heureux et acceptera la baisse?

+0

Si quelqu'un connaît une implémentation complète de IStream/IStorage pour une URL http, veuillez poster une autre réponse ici, il y a quelques résultats google pour ce problème. –

+0

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

Répondre

2

Normalement, les unions C sont représentées en utilisant StructLayout.Explicit en C#. Cela ne fonctionnera probablement pas dans votre cas, cependant - tandis que vous pouvez superposer IStream et IStorage références comme ça, le marshaller essayera de marier les deux. Votre meilleur pari est probablement de simplement déclarer le champ IntPtr dans votre déclaration de STGMEDIUM, et d'utiliser Marshal.GetIUnknownForObject pour l'initialiser.

+0

Merci! Je ne sais pas comment j'ai raté GetIUnknownForObject ... Je pense que je vais devoir décomposer et comprendre ce qu'est un jour Marshaling ... –

0

Je pense que le sujet est dépassé par une longue, mais ceux qui cherchent un frein de fichier et déposer vérifier cette discussion et surtout le poste de dbirdz: http://www.daniweb.com/forums/thread166429.html

Dans mes yeux ce serait même appliquer à cette application, je J'essayerais d'écrire mon flux dans un fichier temporaire qui pourrait ensuite être déplacé vers son emplacement.

Questions connexes