Вопрос

Я слишком долго работал над тем, что звучит как простая функциональность.Идея заключается в том, что у меня есть приложение с древовидным представлением.Это древовидное представление представляет содержимое базы данных, организованное в файлы и папки, очень похоже на проводник Windows.Таким образом, имеет смысл, что пользователь должен иметь возможность перетаскивать эти файлы / папки из моего приложения в проводник Windows.

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

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

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

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

Это было полезно?

Решение

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top