Re: Drag&Drop vs NTFS Stream
От: Vi2 Удмуртия http://www.adem.ru
Дата: 06.03.09 17:54
Оценка:
Здравствуйте, DovydenkoAndrej, Вы писали:

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


DA>Drag&Drop реализовал через пару CF_FILEDESCRIPTOR&CF_FILECONTENTS, таким образом я отдаю эксплореру экземпляр IStream из которого тот берёт содержимое файла. Файл создаёться полностью валидный, за исключением отсутсвия в нём альтернативного потока. Точный путь до созданного файла остаётся неизвестным, и поэтому, дописать данные после завершения операции нельзя.


DA>Создать временный файл с потоком и отдавать его эксплореру через CF_HDROP тоже нельзя, файл скачиваеться с удалённого и весьма медленного сервера. Для CF_HDROP операция скачивания должна быть выполнена до начала сброса, чтоб отдать системе имя временноно файла(опятьже не ясно когда его можно будет удалять). С другой стороны пара CF_FILEDESCRIPTOR&CF_FILECONTENTS в этом отношении очень удобна, операция скачивания откладываеться на самый последний момент.


DA>Посоветуйте, как мне сделать создание альтернативного потока NTFS в файле созданном через Drag&Drop?


Изучая события в VB, связанные с drag'n'drop, CF_HDROP позволяет отложенную загрузку. Другие форматы я не проверял, но думаю, что задействуется общий механизм, который не должен делать отличия в форматах. Косвенно CF_FILEDESCRIPTOR&CF_FILECONTENTS подтверждает. Что искать и где искать — не могу подсказать.

В подтверждение моих слов привожу обработчики событий начала операции drag'n'drop, запроса данных и освобождения в конце операции drag'n'drop при отработке реального drop-а. Если операции drop не было, то событие на запрос данных не приходит.
Private Sub xxxx_OLEStartDrag(Data As MSComctlLib.DataObject, AllowedEffects As Long)
  AllowedEffects = (vbDropEffectMove Or vbDropEffectCopy)
...
  Call Data.Clear
  Call Data.SetData(, vbCFFiles) ' vbCFFiles == CF_HDROP
End Sub

Private Sub xxxx_OLESetData(Data As MSComctlLib.DataObject, DataFormat As Integer)
  If DataFormat = vbCFFiles Then ' vbCFFiles == CF_HDROP
    msDraggedFile = "..."
    Call SaveAs(msDraggedFile, ...)
    Call Data.Files.Add(msDraggedFile)
  End If
End Sub

Private Sub xxxx_OLECompleteDrag(Effect As Long)
  If Len(msDraggedFile) <> 0 Then
    Call Kill(msDraggedFile)
    msDraggedFile = ""
  End If
...
  Effect = vbDropEffectNone
End Sub

PS
MSComctlLib.DataObject — это VB-шный аналог или реализация интерфейса IDataObject.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.