Я начал пытаться реализовать перетаскивание виртуальных файлов (из приложения C# 4/WPF) с этим codeproject учебным руководством. После пребывания в течение некоторого времени, пытаясь выяснить ошибку DV_E_FORMATETC, я выяснил, что должен поддерживать "формат данных" Массива IDList Shell. Но, кажется, существует рядом с нулевой документацией относительно того, что на самом деле делает этот формат.
После некоторого поиска я нашел эту страницу на усовершенствованной передаче данных, которая сказала, что Массив IDList Shell был указателем на структуру CIDA. Эта структура CIDA затем содержит количество PIDLs и список смещений им. Таким образом что, черт возьми, PIDL? Еще после некоторого поиска этот вид страницы подразумевает, что это - указатель на ITEMIDLIST, который сам содержит единственного участника, который является списком SHITEMIDs.
Я сделал еще некоторое чтение, я все еще не могу сказать то, для чего несколько PIDLs, но существует один SHITEMID для каждого "уровня" в пути. По крайней мере это - одна решенная тайна.
Моя следующая идея состояла в том, чтобы попытаться перетащить файл из другого приложения с виртуальными файлами (WinSCP). Я просто вернул MemoryStream для этого формата. По крайней мере, я знаю, какой класс предусмотреть вещь, но это не помогает вообще для объяснения, что вставить его. Я пытался исследовать этот MemoryStream на основе форматов в ссылках выше, но я не имел никакого успеха. Я просто возвратил данные мусора, и одно из 'cb' полей сказало мне, что было 18 000 байтов длиной, когда целый поток составлял только 539 байтов.
Кроме того, на дополнительные материалы для чтения, эта страница, кажется, подразумевает, что данные, содержавшиеся в PIDL на самом деле, завершают то, чтобы быть путем, и исследование содержания упомянутого MemoryStream в Hex-редакторе привело к пути в моем локальном каталоге Temp (разделение в части, так или иначе).
Кажется, что WinSCP просто использует расширение оболочки для обработки отбрасывания на проводнике, что-то, к чему я действительно не хочу обращаться. Однако это имеет альтернативный режим, где это прерывает dragdrop, пока это не передает временной папке - это приемлемо для меня, но у меня нет самой слабой идеи, как сделать это.
Мои вопросы теперь:
Любая справка или даже связывается, которые объясняют, что я должен делать, значительно ценился бы.
Править: Таким образом, вот то, как я на самом деле сделал это в конце:
Я фрагментировал большую часть кода из учебного руководства CodeProject выше, сохранив функции для создания FileGroupDescriptor. Я затем повторно реализовал интерфейс.Net IDataObject (и на самом деле, я не должен был использовать интерфейс COM IDataObject вообще). Я затем вынужден синхронно загрузить файл в фоновом режиме и пасовать назад MemoryStream из GetData (). Удобно, фактическое копирование в фоновом режиме, но ожидание данных находится на переднем плане. Спасибо, проводник. Любые довольно большие файлы являются медленными, но на данный момент это "работает", который является больше, чем я могу сказать в течение прошлых нескольких недель.
Я действительно пытался передать класс PipeStream, который я использую внутренне для передач, но проводник не доволен этим:
Так, я не уверен, что идеальный случай на самом деле возможен. Однако, благодарит за всю Вашу справку. Я даю щедрость JPW, потому что его ответы в конечном счете устанавливают меня на правильном пути.
Заявление об ограничении ответственности : я не являюсь экспертом ни в программировании Windows Shell, ни в программировании COM, и особенно в программировании COM с использованием .NET.
Заявление об ограничении ответственности 2 : Программирование оболочки довольно сложно, и Windows Explorer может дать сбой. (Обязательно прочтите информацию в MSDN по отладке расширений оболочки.)
Вот что я могу предоставить, чтобы ответить на ваши вопросы:
Надеюсь, некоторая информация будет вам полезна.
Изменить : Вы также можете реализовать QueryGetData и EnumerableFormatEtc соответствующим образом, чтобы указать, что ваш объект не поддерживает рассматриваемый формат. Может быть, тогда проводник Windows попробует другой формат.
Редактировать 2 : Хотя вы уже выбрали решение, вот еще немного информации о том, как перетаскивать асинхронно (для больших файлов), возможно, вы (или, по крайней мере, кто-то ищет ответ на аналогичная проблема, кто это читает) сочтут это полезным: http://msdn.microsoft.com/en-us/library/bb776904 (VS.85) .aspx # async
Думаю, Браузер файлов C # по адресу http://www.codeproject.com/KB/miscctrl/FileBrowser.aspx - это то, что сейчас вам больше всего поможет.
Эти статьи бесценны.
C # использует Shell, Часть 1 на http://www.codeproject.com/KB/shell/csdoesshell1.aspx
C # делает Shell, Часть 2 на http : //www.codeproject.com/KB/shell/csdoesshell2.aspx
C # использует Shell, часть 3 на http://www.codeproject.com/KB/shell/csdoesshell3.aspx
C # делает Shell, Часть 4 на http://www.codeproject.com/KB/shell/csdoesshell4.spx
Edanmo.ShellExtensions абсолютно необходим. http://www.mvps.org/emorcillo/en/code/shell/shellextensions.shtml
Обратите внимание, что некоторые из этих COM-интерфейсов уже определены в .NET 2.0. (Я не проверял 4.0, но сомневаюсь, что Microsoft добавила дополнительную поддержку для интерфейсов Shell / COM.)
Реализация представления папки из http://msdn.microsoft.com/en -us / library / cc144092.aspx
Перенос объектов оболочки с помощью перетаскивания и буфера обмена из http://msdn.microsoft.com/en-us/library/bb776905.aspx
Реализация основные интерфейсы объектов папок из http://msdn.microsoft.com/en-us/library/cc144093.aspx
Полное руководство идиота по написанию расширений оболочки - индекс , Майкл Данн, Указатель всех статей в Руководстве для идиотов из http://www.codeproject.com/KB/shell/shellextguideindex.aspx (Это статьи, которые помогли мне больше всего.)
Полное руководство идиота по написанию расширений пространства имен - Часть I на http://www.codeproject.com/kb/shell/namespcextguide1.aspx . Это то, что вы ищете?
Видели ли вы эту статью? Как перетащить виртуальный файл из вашего приложения в проводник Windows Исходный код на c++, но он должен помочь вам понять, как все это работает.