Arraste e solte a partir de C # para Windows Explorer com IStorage / IStream
-
16-09-2019 - |
Pergunta
Eu tenho trabalhado sobre o que soa como uma funcionalidade simples por muito tempo agora. A idéia é que eu tenho um aplicativo com um TreeView. Este treeview representa conteúdo de um banco de dados organizado em arquivos e pastas, assim como o Windows Explorer. Portanto, faz sentido que o usuário deve ser capaz de arrastar os arquivos / pastas fora do meu aplicativo e no Windows Explorer.
Eu decidi que eu deveria usar um IStream
se arrastar um arquivo ou um IStorage
se arrastar uma pasta. Depois de um tempo muito longo e aprender muito mais do que eu sempre quis saber sobre o Win32 / COM (e uma cutucada de uma pessoa muito útil aqui), eu finalmente tenho que IStream
ou IStorage
criado.
Então eu achei que, para passar este IStream
ou IStorage
off para o Windows Explorer, eu tinha para obtê-lo em uma STGMEDIUM
. Claro, o medium.tymed vai ser IStream
ou IStorage
, dependendo de qual eu estou usando, mas como eu entendo o medium.unionmember
deve ser um ponteiro para a IStream/IStorage
.
Eu tentei usar a palavra-chave fixa (mas não é blittable, é claro), eu tentei apenas converter a maldita coisa para um array de bytes, mas não pode vir até com uma maneira de fazer isso acontecer, eu tentei usar GCHandle para fixá-lo (mas ainda não é blittable), e várias outras coisas que não funcionou.
Assim, a minha pergunta é esta:? IStorage s
Dado e STGMEDIUM m
, como faço para preencher m.unionmember
para que o Windows Explorer irá ser feliz e aceitar a queda
Solução
Normalmente, C são representados usando StructLayout.Explicit
em C #. Isso provavelmente não irá funcionar no seu caso, no entanto - enquanto você pode sobrepor IStream
e IStorage
referências como essas, o marshaller vai tentar organizar ambos. Sua melhor aposta é provavelmente apenas para declarar o campo como IntPtr
em sua declaração de STGMEDIUM
e uso Marshal.GetIUnknownForObject
para inicializar-lo.
Outras dicas
Eu acho que o tema está desatualizado por muito tempo, no entanto quem procura um arrastar de arquivo e verificação abandonam essa discussão e, especialmente, o cargo de dbirdz: http://www.daniweb.com/forums/thread166429.html
Em meus olhos isso seria até mesmo se aplica a esta aplicação, eu tentaria escrever meu fluxo em um arquivo temporário que poderia então ser movido para a sua localização.