Перетащите C # в проводник Windows с помощью IStorage / IStream
-
16-09-2019 - |
Вопрос
Я слишком долго работал над тем, что звучит как простая функциональность.Идея заключается в том, что у меня есть приложение с древовидным представлением.Это древовидное представление представляет содержимое базы данных, организованное в файлы и папки, очень похоже на проводник 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
На мой взгляд, это было бы применимо даже к этому приложению, я бы попытался записать свой поток во временный файл, который затем можно было бы переместить в его местоположение.