Здравствуйте, white_znake, Вы писали:
_>Здравствуйте, уважаемые коллеги
_>Подскажите как отобразить свой NSE в Save File Dialog? _>Какие методы каких интерфейсов переопределить
_>P.S. в инете найти не смог
Готового ответа нет, т.к. по этому поводу документация отсутствует. Что удалось обнаружить в свое время:
* При вызове IShellFolder::GetAttributesOf должны быть установлены атрибуты SFGAO_FILESYSTEM/SFGAO_FILEANCESTOR (включая корневую папку — для нее атрибуты устанавливаются в реестре).
* Для любых(?) папок вызов IShellFolder::GetDisplayNameOf(... SHGDN_FORPARSING | ?) должен возвращать путь к существующей папке.
* Также нужна реализация IShellFolder::ParseDisplayName.
Но с другой стороны, если следовать MSDN'у, то на запрос SHGDN_FORPARSING возвращаемые пути должны начинаться с
'::{CLSID for NSE}' — в этом случае не ясно как это(File Open Dialog) вообще может работать т.к. таких путей не существует.
Хотя, например по всем виртуальным папкам 'Сетевое окружение\Вся сеть\Microsoft Windows Network' можно свободно ходить
и любые пути возвращенные GetDisplayNameOf всегда состоят только из названия виртуальной папки(кроме корня).
Можно еще посмотерть исходники windows, там что-то было по этому поводу.
ЮЖ>* Для любых(?) папок вызов IShellFolder::GetDisplayNameOf(... SHGDN_FORPARSING | ?) должен возвращать путь к существующей папке. ЮЖ>* Также нужна реализация IShellFolder::ParseDisplayName.
ЮЖ>Но с другой стороны, если следовать MSDN'у, то на запрос SHGDN_FORPARSING возвращаемые пути должны начинаться с ЮЖ>'::{CLSID for NSE}' — в этом случае не ясно как это(File Open Dialog) вообще может работать т.к. таких путей не существует.
ЮЖ>Хотя, например по всем виртуальным папкам 'Сетевое окружение\Вся сеть\Microsoft Windows Network' можно свободно ходить ЮЖ>и любые пути возвращенные GetDisplayNameOf всегда состоят только из названия виртуальной папки(кроме корня). ЮЖ>Можно еще посмотерть исходники windows, там что-то было по этому поводу.
Т.е. если у меня:
VirtualDrive\Personal Documents\Folder1 — виртуальный путь к папке Folder1, то мне и надо возвращать VirtualDrive\Personal Documents\Folder1?
Здравствуйте, white_znake, Вы писали:
_>Здравствуйте, Юрий Жмеренецкий, Вы писали:
ЮЖ>>* Для любых(?) папок вызов IShellFolder::GetDisplayNameOf(... SHGDN_FORPARSING | ?) должен возвращать путь к существующей папке. ЮЖ>>* Также нужна реализация IShellFolder::ParseDisplayName.
ЮЖ>>Но с другой стороны, если следовать MSDN'у, то на запрос SHGDN_FORPARSING возвращаемые пути должны начинаться с ЮЖ>>'::{CLSID for NSE}' — в этом случае не ясно как это(File Open Dialog) вообще может работать т.к. таких путей не существует.
ЮЖ>>Хотя, например по всем виртуальным папкам 'Сетевое окружение\Вся сеть\Microsoft Windows Network' можно свободно ходить ЮЖ>>и любые пути возвращенные GetDisplayNameOf всегда состоят только из названия виртуальной папки(кроме корня). ЮЖ>>Можно еще посмотерть исходники windows, там что-то было по этому поводу.
_>Т.е. если у меня:
_>VirtualDrive\Personal Documents\Folder1 — виртуальный путь к папке Folder1, то мне и надо возвращать VirtualDrive\Personal Documents\Folder1?
Зависит от флагов. Есть два варианта путей — относительно радительской папки и относительно рабочего стола. В описании SHGNO есть описания различных комбинаций параметров.
Например для папки 'Мои документы' на рабочем столе, пути возвращаемые IShellFolder::GetDisplayNameOf такие:
Относительно родительской папки:
Normal 'Мои документы'
Parsing '::{GUID}'
Addressbar 'Мои документы'
Parsing Addressbar 'Мои документы'
Editing 'Мои документы'
Относительно рабочего стола:
Normal 'Мои документы'
Parsing 'C:\Documents and Settings\<User>\My Documents' <------ SHGDN_FORPARSING
Addressbar 'Мои документы'
Parsing Addressbar 'Мои документы'
Editing 'Мои документы'
Для обычной папки:
Относительно родительской папки:
Normal 'qwerty'
Parsing 'qwerty'
Addressbar 'qwerty'
Parsing Addressbar 'qwerty'
Editing 'qwerty'
Относительно рабочего стола:
Normal 'qwerty'
Parsing 'C:\temp\qwerty' <--------- SHGDN_FORPARSING
Addressbar 'qwerty'
Parsing Addressbar 'C:\temp\qwerty'
Editing 'qwerty'
А вот для папки 'Сетевое окружение\Вся сеть\Microsoft Windows Network' немного иначе:
Атрибуты: SFGAO_FILESYSANCESTOR | SFGAO_STORAGEANCESTOR | SFGAO_HASSUBFOLDER | SFGAO_HASPROPSHEET | SFGAO_FOLDER | SFGAO_CANLINK
Относительно родительской папки:
Normal 'Microsoft Windows Network'
Parsing 'Microsoft Windows Network'
Addressbar 'Microsoft Windows Network'
Parsing Addressbar 'Microsoft Windows Network'
Editing 'Microsoft Windows Network'
Относительно рабочего стола:
Normal 'Microsoft Windows Network'
Parsing 'Microsoft Windows Network' <-- такой папки не существует(и флаг SFGAO_FILESYSTEM отсутствует).
Addressbar 'Microsoft Windows Network'
Parsing Addressbar 'Microsoft Windows Network'
Editing 'Microsoft Windows Network'
Это только для навигации по папкам из File Save Dialog. При сохранении оболочка должна откуда-то получить имя физической папки...
Здравствуйте, Юрий Жмеренецкий, Вы писали:
ЮЖ>Это только для навигации по папкам из File Save Dialog. При сохранении оболочка должна откуда-то получить имя физической папки...
Сейчас пытаюсь понять как сохранять файлы... Кроме как захучить сохранение в Save Dialog в голову ничего не приходит
Здравствуйте, white_znake, Вы писали:
_>Здравствуйте, Юрий Жмеренецкий, Вы писали:
ЮЖ>>Это только для навигации по папкам из File Save Dialog. При сохранении оболочка должна откуда-то получить имя физической папки...
_>Сейчас пытаюсь понять как сохранять файлы... Кроме как захучить сохранение в Save Dialog в голову ничего не приходит
Можно поинтересоваться результатами работы у автора? Сам сейчас мучаюсь этой же проблемой
Re[2]: Показать NSE в Save File Dialog
От:
Аноним
Дата:
19.03.09 13:55
Оценка:
Здравствуйте, Юрий Жмеренецкий, Вы писали:
ЮЖ>Здравствуйте, white_znake, Вы писали:
_>>Здравствуйте, уважаемые коллеги
_>>Подскажите как отобразить свой NSE в Save File Dialog? _>>Какие методы каких интерфейсов переопределить
_>>P.S. в инете найти не смог
ЮЖ>Готового ответа нет, т.к. по этому поводу документация отсутствует. Что удалось обнаружить в свое время: ЮЖ>* При вызове IShellFolder::GetAttributesOf должны быть установлены атрибуты SFGAO_FILESYSTEM/SFGAO_FILEANCESTOR (включая корневую папку — для нее атрибуты устанавливаются в реестре). ЮЖ>* Для любых(?) папок вызов IShellFolder::GetDisplayNameOf(... SHGDN_FORPARSING | ?) должен возвращать путь к существующей папке.
Из за чего при Open диалоге эксплорер даже не вызывает GetDisplayNameOf? Или я что-то не правильно делаю?
ЮЖ>* Также нужна реализация IShellFolder::ParseDisplayName.
ЮЖ>Но с другой стороны, если следовать MSDN'у, то на запрос SHGDN_FORPARSING возвращаемые пути должны начинаться с ЮЖ>'::{CLSID for NSE}' — в этом случае не ясно как это(File Open Dialog) вообще может работать т.к. таких путей не существует.
ЮЖ>Хотя, например по всем виртуальным папкам 'Сетевое окружение\Вся сеть\Microsoft Windows Network' можно свободно ходить ЮЖ>и любые пути возвращенные GetDisplayNameOf всегда состоят только из названия виртуальной папки(кроме корня). ЮЖ>Можно еще посмотерть исходники windows, там что-то было по этому поводу.
ЮЖ>PS. Есть еще диалоги CopyTo/MoveTo.