Пишу класс на Delphi для IShellFolder.
Знаю как создать PIDL,но не знаю как правильно их заполнить( "вручную" ). (cb abID).
Желательно пример.
Заранее спасибо.
Здравствуйте DmitryS, вы писали:
DS>Привет Alex Fedotov. Статья по shell namespace на RSDN и MSDN читал.
DS>Но там нет примеров для заполнения PIDL.
DS>Например есть такие примеры: "D:\папка1\папка11"
DS> "D:\папка2\файл1"
DS> "D:\папка2\файл2"
DS>Вопрос : какой полный PIDL для папка11
DS>какой PIDL для папки11 относительно папка1
ОК, попробуем еще раз.
PIDL = pointer to an identifier list = указатель на список идентификаторов. Каждый идентификатор в списке соответствует одному уровню иерархии и описывается структурой SHITEMID:
typedef struct _SHITEMID {
USHORT cb;
BYTE abID[1];
} SHITEMID;
Только объект папки, к которому относится этот идентификатор знает как интерпретировать данные в abID.
Единственный корректный способ получить эти данные это вызвать ParseDisplayName или EnumObjects у соответствующего объекта папки. Нет способа сконструировать эти данные "просто так".
То есть, чтобы узнать полный PIDL для папка11, нужно взять корневой объект папки c помощью SHGetDesktopFolder и вызывать у него ParseDisplayName на "D:\папка1\папка11". Результирующий список идентификаторов может выглядеть как
+ PIDL папка11 относительно папка 1
/----------------
+----+--------+----+--------+----+--------+----+---------+---+
| cb | abID | cb | abID | cb | abID | cb | abID | 0 |
+----+--------+----+--------+----+--------+----+---------+---+
\-----------/ \-----------/ \-----------/ \------------/ \-/
| | | | + признак конца
| | | |
| | | + идентификатор папка11 в пaпка1
| | |
| | + идентификатор папка1 в D:
| |
| + идентификатор D: в My Computer
|
+ идентификатор My Computer в root namespace
Конкретные значения cb и abID известны только объектам папок, которые содержат соотвествующие элементы.
DS>т.е. какие должны быть cb и abID чтобы другие пользователи используя интерфейс IShellFolder а затем EnumObjects (методы этих интерфейсов поддерживаются моими классами) могли работать с папками которым эти инерфейсы приписаны, также как и с реализованными Microsoft.
Если ты реализуешь свое собственное namespace extension, ты волен выбрать что угодно в качестве идентификаторов элементов, главное, чтобы ты их потом мог отличить. Если же ты делаешь что-то другое, please clarify.