Заполнение PIDL....
От: DmitryS  
Дата: 31.07.01 10:58
Оценка:
Пишу класс на Delphi для IShellFolder.
Знаю как создать PIDL,но не знаю как правильно их заполнить( "вручную" ). (cb abID).
Желательно пример.
Заранее спасибо.
Re: Заполнение PIDL....
От: Alex Fedotov США  
Дата: 01.08.01 05:02
Оценка:
Здравствуйте DmitryS, вы писали:

DS>Знаю как создать PIDL,но не знаю как правильно их заполнить( "вручную" ). (cb abID).


PIDL — это opaque структура, только объект папки знает как интерпретировать данные в abID. Те же, кто пользуются интерфейсом IShellFolder, используют методы ParseDisplayName и EnumObjects для получения PIDL.

Вроде бы на RSDN есть статья по shell namespace, советую ознакомиться.
-- Alex Fedotov
Re[2]: Заполнение PIDL....
От: DmitryS  
Дата: 01.08.01 05:46
Оценка:
Здравствуйте Alex Fedotov, вы писали:

AF>Здравствуйте DmitryS, вы писали:


DS>>Знаю как создать PIDL,но не знаю как правильно их заполнить( "вручную" ). (cb abID).


AF>PIDL — это opaque структура, только объект папки знает как интерпретировать данные в abID. Те же, кто пользуются интерфейсом IShellFolder, используют методы ParseDisplayName и EnumObjects для получения PIDL.


AF>Вроде бы на RSDN есть статья по shell namespace, советую ознакомиться.




Привет Alex Fedotov. Статья по shell namespace на RSDN и MSDN читал.
Но там нет примеров для заполнения PIDL.

Например есть такие примеры: "D:\папка1\папка11"
"D:\папка2\файл1"
"D:\папка2\файл2"
Вопрос : какой полный PIDL для папка11
какой PIDL для папки11 относительно папка1
т.е. какие должны быть cb и abID чтобы другие пользователи используя интерфейс IShellFolder а затем EnumObjects
(методы этих интерфейсов поддерживаются моими классами) могли работать с папками которым эти инерфейсы приписаны,
также как и с реализованными Microsoft.
Re[3]: Заполнение PIDL....
От: Alex Fedotov США  
Дата: 02.08.01 16:48
Оценка:
Здравствуйте 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.
-- Alex Fedotov
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.