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

Foi útil?

Solução

sindicatos

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top