2009-08-14 6 views
5

Я уже давно работаю над тем, что звучит как простая функциональность. Идея состоит в том, что у меня есть приложение с TreeView. Это treeview представляет содержимое базы данных, организованной в файлы и папки, подобно Windows Explorer. Поэтому имеет смысл, что пользователь должен иметь возможность перетаскивать эти файлы/папки из моего приложения и в проводник Windows.Перетаскивание из C# в Windows Explorer с IStorage/IStream

Я решил, что должен использовать IStream, если они перетаскивают файл или IStorage, если они перетаскивают папку. После очень долгого времени и обучения больше, чем я когда-либо хотел узнать о Win32/COM (и толчок от очень полезного человека здесь), я, наконец, создал IStream или IStorage.

Тогда я нашел, что передать это IStream или IStorage в Проводник Windows, мне пришлось его получить в STGMEDIUM. Конечно, medium.tymed будет либо IStream, либо IStorage, в зависимости от того, что я использую, но, как я понимаю, medium.unionmember должен быть указателем на IStream/IStorage.

Я пробовал использовать фиксированное ключевое слово (но это, конечно, не горит), я пробовал просто преобразовать взорванную вещь в массив байтов, но не могу придумать способ сделать это, Я попытался использовать GCHandle, чтобы прикрепить его (но он все еще не горит) и несколько других вещей, которые не сработали.

Так что мой вопрос: Учитывая IStorage s и STGMEDIUM m, как я могу заполнить m.unionmember, чтобы Windows Explorer был счастлив и принял падение?

+0

Если кто-то знает о полной реализации IStream/IStorage для URL-адреса http, пожалуйста, напишите здесь другой ответ, для этой проблемы существует несколько результатов Google. –

+0

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

ответ

2

Обычно C-соединения представлены с использованием StructLayout.Explicit в C#. Это, вероятно, не будет работать в вашем случае, однако - пока вы можете наложить IStream и IStorage таких ссылок, маршаллер попытается маршалировать оба. Лучше всего, чтобы просто объявить поле как в вашем объявлении STGMEDIUM и использовать Marshal.GetIUnknownForObject для его инициализации.

+0

Спасибо! Я не знаю, как я пропустил GetIUnknownForObject ... Думаю, мне придется сломаться и на самом деле выяснить, что такое Маршалин в один прекрасный день ... – 2009-08-14 21:49:40

0

Я думаю, что тема устарел давно, однако, кто ищет файл перетаскиванием проверить эту дискуссию и особенно пост dbirdz: http://www.daniweb.com/forums/thread166429.html

В моих глазах это было бы даже обратиться к этому приложению, я Попробуйте записать мой поток во временный файл, который затем можно будет перенести в его местоположение.