Glisser-déposer à partir de C # Windows Explorer avec IStorage / IStream
-
16-09-2019 - |
Question
Je travaille sur ce qui ressemble à des fonctionnalités simples pour trop longtemps. L'idée est que j'ai une application avec un TreeView. Ce TreeView représente le contenu d'une base de données organisée en fichiers et des dossiers, un peu comme l'Explorateur Windows. Il est donc logique que l'utilisateur doit être en mesure de faire glisser les fichiers / dossiers de mon application et dans l'Explorateur Windows.
J'ai décidé que je devrais utiliser un IStream
si elles faites glisser un fichier ou un IStorage
si elles faites glisser un dossier. Après un temps très long et d'apprendre beaucoup plus que ce que je voulais savoir sur Win32 / COM (et un petit coup de pouce d'une personne très utile ici), j'ai enfin que IStream
ou IStorage
créé.
Ensuite, je trouve que pour passer ce IStream
ou IStorage
hors de l'Explorateur Windows, je devais le faire dans un STGMEDIUM
. Bien sûr, les medium.tymed seront soit IStream
ou IStorage
, selon que je me sers, mais si je comprends bien le medium.unionmember
doit être un pointeur sur le IStream/IStorage
.
Je l'ai essayé d'utiliser le mot-clé fixe (mais ce n'est pas blittable, bien sûr), je l'ai essayé juste convertir la chose sablée à un tableau d'octets, mais ne peut pas trouver un moyen pour y arriver, je « ai essayé d'utiliser GCHandle à elle la broche (mais il est toujours pas blittable), et plusieurs autres choses qui ne fonctionnent pas.
Alors ma question est la suivante: Étant donné IStorage s
et STGMEDIUM m
, comment puis-je remplir m.unionmember
afin que Windows Explorer sera heureux et accepter la baisse
La solution
Normalement, les syndicats C sont représentés à l'aide StructLayout.Explicit
en C #. Ce ne fonctionnera probablement pas dans votre cas, cependant - alors que vous pouvez superposer des références IStream
et IStorage
comme ça, le placier va essayer de rassembler les deux. Votre meilleur pari est probablement de déclarer que le terrain IntPtr
dans votre déclaration de STGMEDIUM
et utiliser Marshal.GetIUnknownForObject
pour l'initialiser.
Autres conseils
Je pense que le sujet est dépassé par une longue, mais ceux qui cherchent un glisser-déposer de fichiers 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 vais essayer d'écrire mon flux dans un fichier temporaire qui pourrait ensuite être déplacé à son emplacement.