Здравствуйте, 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.