Namespace extension, IShellFolder и проводник
От: Хитрик Денис Россия RSDN
Дата: 30.06.04 12:54
Оценка:
Вопрос вот в чём: создаю namespace extension, регистрирую его в реестре в Desktop/Namespaces, запускаю эксплорер. Получаю следующий результат:


Расширение здесь — SNExLibrary.DesnaSF. Оно видно в области IShellView, и его нет в дереве слева! Хочу, чтобы оно там (в дереве) появилось.

Куда копать, подскажите
Правила нашего с вами форума.
Как правильно задавать вопросы. © 2001 by Eric S. Raymond; перевод: © 2002 Валерий Кравчук.
Re: Namespace extension, IShellFolder и проводник
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 30.06.04 13:05
Оценка: 13 (2)
Здравствуйте, Хитрик Денис, Вы писали:

ХД>Расширение здесь — SNExLibrary.DesnaSF. Оно видно в области IShellView, и его нет в дереве слева! Хочу, чтобы оно там (в дереве) появилось.


ХД>Куда копать, подскажите


В сторону реестра. У твоей компоненты нужно прописать флаги, которые будут примяться к корневой папке. Название параметра и какие биты нужно прописать — звиняй уже не помню ... Можно посмотреть что там у "мой копьютер" или "корзина" прописано.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[2]: Namespace extension, IShellFolder и проводник
От: Хитрик Денис Россия RSDN
Дата: 30.06.04 14:16
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>В сторону реестра. У твоей компоненты нужно прописать флаги, которые будут примяться к корневой папке. Название параметра и какие биты нужно прописать — звиняй уже не помню :) ... Можно посмотреть что там у "мой копьютер" или "корзина" прописано


Флаги расположенные HKCR/CLSID/{guid}/ShellFolder/Attrubutes? Или где-то ещё?
Правила нашего с вами форума.
Как правильно задавать вопросы. © 2001 by Eric S. Raymond; перевод: © 2002 Валерий Кравчук.
Re[3]: Namespace extension, IShellFolder и проводник
От: Хитрик Денис Россия RSDN
Дата: 30.06.04 14:54
Оценка: 7 (1) :)
Здравствуйте, Хитрик Денис, Вы писали:

КД>>В сторону реестра. У твоей компоненты нужно прописать флаги, которые будут примяться к корневой папке. Название параметра и какие биты нужно прописать — звиняй уже не помню ... Можно посмотреть что там у "мой копьютер" или "корзина" прописано

ХД>Флаги расположенные HKCR/CLSID/{guid}/ShellFolder/Attrubutes? Или где-то ещё?

Да, именно там! Оказалось, что я один раз их поставил, но при следующем же запуске приложения регистрации все значения поудалялись, потому папка и не показывалась.

Спасибо Дмитрию за то, что заставил меня ещё раз прошерстить реестр и обнаружить эту досадную неприятность!
Правила нашего с вами форума.
Как правильно задавать вопросы. © 2001 by Eric S. Raymond; перевод: © 2002 Валерий Кравчук.
Re[4]: Namespace extension, IShellFolder и проводник
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 30.06.04 15:47
Оценка:
Здравствуйте, Хитрик Денис, Вы писали:

ХД>Да, именно там! Оказалось, что я один раз их поставил, но при следующем же запуске приложения регистрации все значения поудалялись, потому папка и не показывалась.


ХД>Спасибо Дмитрию за то, что заставил меня ещё раз прошерстить реестр и обнаружить эту досадную неприятность!


Хоть кому-то пригодились мои школьные знания
Это все мелочи — главная жопа с проводником в том что внутри него нельзя по-человечески использовать CoCreateInstace для создания других COM-объектов из DLL (до NT4 — точно). Вот. Но это тоже решаемо
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[5]: Namespace extension, IShellFolder и проводник
От: Хитрик Денис Россия RSDN
Дата: 30.06.04 16:04
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Хоть кому-то пригодились мои школьные знания




КД>Это все мелочи — главная жопа с проводником в том что внутри него нельзя по-человечески использовать CoCreateInstace для создания других COM-объектов из DLL (до NT4 — точно). Вот. Но это тоже решаемо


Хм... не уверен, что мне это всё пригодится, но можно ли чуть подробнее? Общее направление
Правила нашего с вами форума.
Как правильно задавать вопросы. © 2001 by Eric S. Raymond; перевод: © 2002 Валерий Кравчук.
Re[6]: Namespace extension, IShellFolder и проводник
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 01.07.04 06:09
Оценка:
Здравствуйте, Хитрик Денис, Вы писали:

КД>>Это все мелочи — главная жопа с проводником в том что внутри него нельзя по-человечески использовать CoCreateInstace для создания других COM-объектов из DLL (до NT4 — точно). Вот. Но это тоже решаемо


ХД>Хм... не уверен, что мне это всё пригодится, но можно ли чуть подробнее? Общее направление


На сколько я помню выводы из своих "исследований", проводник не инициализирует COM внутри своих потоков и для создания компонент и использует свой альтернативный(?) механизм. Вообщем, в конечном итоге я написал свой "менеждер" COM-объектов из DLL, который управляет DLL-ями. И все начало работать без всяких труднообъяснимых проблем.

Так что если вдруг твоя программа начнет расти — лучше сразу обрати на это внимание.
Принцип работы этого менеджера достаточно тривиальный:
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[7]: Namespace extension, IShellFolder и проводник
От: simply_ask  
Дата: 12.07.05 09:21
Оценка:
Я дико извиняюсь, но может быть кто-нибудь поделится значением Attributes, при котором shellfolder будет открываться по левому клику в explorer tree view ? Спасибо
Re[8]: Namespace extension, IShellFolder и проводник
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 12.07.05 13:15
Оценка:
Здравствуйте, simply_ask, Вы писали:

_>Я дико извиняюсь, но может быть кто-нибудь поделится значением Attributes, при котором shellfolder будет открываться по левому клику в explorer tree view ? Спасибо


см. описание IShellFolder::GetAttributesOf и содержимое файла shlobj.h

То что тебя интересует определяется наличием флага SFGAO_HASSUBFOLDER

// IShellFolder::GetAttributesOf flags
// DESCRIPTION:
//      SFGAO_CANLINK: If this bit is set on an item in the shell folder, a
//            "Create Shortcut" menu item will be added to the File
//            menu and context menus for the item.  If the user selects
//            that command, your IContextMenu::InvokeCommand() will be called
//            with 'link'.
//                 That flag will also be used to determine if "Create Shortcut"
//            should be added when the item in your folder is dragged to another
//            folder.
#define SFGAO_CANCOPY           DROPEFFECT_COPY // Objects can be copied    (0x1)
#define SFGAO_CANMOVE           DROPEFFECT_MOVE // Objects can be moved     (0x2)
#define SFGAO_CANLINK           DROPEFFECT_LINK // Objects can be linked    (0x4)
#define SFGAO_CANRENAME         0x00000010L     // Objects can be renamed
#define SFGAO_CANDELETE         0x00000020L     // Objects can be deleted
#define SFGAO_HASPROPSHEET      0x00000040L     // Objects have property sheets
#define SFGAO_DROPTARGET        0x00000100L     // Objects are drop target
#define SFGAO_CAPABILITYMASK    0x00000177L
#define SFGAO_LINK              0x00010000L     // Shortcut (link)
#define SFGAO_SHARE             0x00020000L     // shared
#define SFGAO_READONLY          0x00040000L     // read-only
#define SFGAO_GHOSTED           0x00080000L     // ghosted icon
#define SFGAO_HIDDEN            0x00080000L     // hidden object
#define SFGAO_DISPLAYATTRMASK   0x000F0000L
#define SFGAO_FILESYSANCESTOR   0x10000000L     // It contains file system folder
#define SFGAO_FOLDER            0x20000000L     // It's a folder.
#define SFGAO_FILESYSTEM        0x40000000L     // is a file system thing (file/folder/root)
#define SFGAO_HASSUBFOLDER      0x80000000L     // Expandable in the map pane
#define SFGAO_CONTENTSMASK      0x80000000L
#define SFGAO_VALIDATE          0x01000000L     // invalidate cached information
#define SFGAO_REMOVABLE         0x02000000L     // is this removeable media?
#define SFGAO_COMPRESSED        0x04000000L     // Object is compressed (use alt color)
#define SFGAO_BROWSABLE         0x08000000L     // is in-place browsable
#define SFGAO_NONENUMERATED     0x00100000L     // is a non-enumerated object
#define SFGAO_NEWCONTENT        0x00200000L     // should show bold in explorer tree
#define SFGAO_CANMONIKER        0x00400000L     // can create monikers for its objects
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[9]: Namespace extension, IShellFolder и проводник
От: simply_ask  
Дата: 12.07.05 13:32
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>см. описание IShellFolder::GetAttributesOf и содержимое файла shlobj.h


КД>То что тебя интересует определяется наличием флага SFGAO_HASSUBFOLDER


Еще раз извиняюсь, но я не программист, я администратор. Мне нужно "пальцем ткнуть" Я так понял, что тип значения "Attributes" DWORD ? Пробовал прописывать в HKCR\CLSID\{мой clsid}\ShellFolder\Attributes 0x80000000 — ничего не получилось Все также не открывается shell folder по левому клику в левом фрейме проводника (explorer tree view). Нюанс: мой shell folder — это линк на сетевую папку, подключаю его через HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace
Re[9]: Namespace extension, IShellFolder и проводник
От: simply_ask  
Дата: 12.07.05 13:54
Оценка:
Кстати, сетевая папка непричем. Сейчас попробовал тоже самое и с локальной. Все приведенные значения, кроме 0x20000000, не помещают shell folder в explorer tree view, но и с 0x20000000 тоже не удается левым кликом открыть фолдер


КД>
КД>// IShellFolder::GetAttributesOf flags
КД>// DESCRIPTION:
КД>//      SFGAO_CANLINK: If this bit is set on an item in the shell folder, a
КД>//            "Create Shortcut" menu item will be added to the File
КД>//            menu and context menus for the item.  If the user selects
КД>//            that command, your IContextMenu::InvokeCommand() will be called
КД>//            with 'link'.
КД>//                 That flag will also be used to determine if "Create Shortcut"
КД>//            should be added when the item in your folder is dragged to another
КД>//            folder.
КД>#define SFGAO_CANCOPY           DROPEFFECT_COPY // Objects can be copied    (0x1)
КД>#define SFGAO_CANMOVE           DROPEFFECT_MOVE // Objects can be moved     (0x2)
КД>#define SFGAO_CANLINK           DROPEFFECT_LINK // Objects can be linked    (0x4)
КД>#define SFGAO_CANRENAME         0x00000010L     // Objects can be renamed
КД>#define SFGAO_CANDELETE         0x00000020L     // Objects can be deleted
КД>#define SFGAO_HASPROPSHEET      0x00000040L     // Objects have property sheets
КД>#define SFGAO_DROPTARGET        0x00000100L     // Objects are drop target
КД>#define SFGAO_CAPABILITYMASK    0x00000177L
КД>#define SFGAO_LINK              0x00010000L     // Shortcut (link)
КД>#define SFGAO_SHARE             0x00020000L     // shared
КД>#define SFGAO_READONLY          0x00040000L     // read-only
КД>#define SFGAO_GHOSTED           0x00080000L     // ghosted icon
КД>#define SFGAO_HIDDEN            0x00080000L     // hidden object
КД>#define SFGAO_DISPLAYATTRMASK   0x000F0000L
КД>#define SFGAO_FILESYSANCESTOR   0x10000000L     // It contains file system folder
КД>#define SFGAO_FOLDER            0x20000000L     // It's a folder.
КД>#define SFGAO_FILESYSTEM        0x40000000L     // is a file system thing (file/folder/root)
КД>#define SFGAO_HASSUBFOLDER      0x80000000L     // Expandable in the map pane
КД>#define SFGAO_CONTENTSMASK      0x80000000L
КД>#define SFGAO_VALIDATE          0x01000000L     // invalidate cached information
КД>#define SFGAO_REMOVABLE         0x02000000L     // is this removeable media?
КД>#define SFGAO_COMPRESSED        0x04000000L     // Object is compressed (use alt color)
КД>#define SFGAO_BROWSABLE         0x08000000L     // is in-place browsable
КД>#define SFGAO_NONENUMERATED     0x00100000L     // is a non-enumerated object
КД>#define SFGAO_NEWCONTENT        0x00200000L     // should show bold in explorer tree
КД>#define SFGAO_CANMONIKER        0x00400000L     // can create monikers for its objects
КД>
Re[10]: Namespace extension, IShellFolder и проводник
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 12.07.05 14:01
Оценка:
Здравствуйте, simply_ask, Вы писали:

КД>>То что тебя интересует определяется наличием флага SFGAO_HASSUBFOLDER

_>Еще раз извиняюсь, но я не программист, я администратор.



_>Я так понял, что тип значения "Attributes" DWORD


Попробуй скомбинировать с флагами SFGAO_FOLDER|SFGAO_FILESYSTEM

Второй флаг, насколько я помню, даёт возможность навигации по твоему дереву в диалогах открытия/записи файлов
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[10]: Namespace extension, IShellFolder и проводник
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 12.07.05 14:05
Оценка:
Здравствуйте, simply_ask, Вы писали:

_>Кстати, сетевая папка непричем. Сейчас попробовал тоже самое и с локальной. Все приведенные значения, кроме 0x20000000, не помещают shell folder в explorer tree view, но и с 0x20000000 тоже не удается левым кликом открыть фолдер

[вырезано]

Пожалуйста, избегайте лишнего цитирования
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[11]: Namespace extension, IShellFolder и проводник
От: simply_ask  
Дата: 12.07.05 14:14
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Попробуй скомбинировать с флагами SFGAO_FOLDER|SFGAO_FILESYSTEM


КД>Второй флаг, насколько я помню, даёт возможность навигации по твоему дереву в диалогах открытия/записи файлов


Скомбинировал все три Получилось 0xE0000000. После этого shell folder стал доступен из левого фрейма и у него появился "плюсик". Но все также нет возможности по левому клику открыть
PS: за overquoting извиляюсь, не со зла
Re[12]: Namespace extension, IShellFolder и проводник
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 12.07.05 14:22
Оценка:
Здравствуйте, simply_ask, Вы писали:

КД>>Попробуй скомбинировать с флагами SFGAO_FOLDER|SFGAO_FILESYSTEM


_>Скомбинировал все три Получилось 0xE0000000. После этого shell folder стал доступен из левого фрейма и у него появился "плюсик". Но все также нет возможности по левому клику открыть


Я чего-то не врубаюсь в смысл нет возможности по левому клику открыть — поясни доходчиво, плиз.

Ну попробуй еще добавить флаг SFGAO_BROWSABLE
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.