Мы уже знаем, что вместо понятного человеку пути к файлу, представленного обычной текстовой строкой, привередливая оболочка Windows предпочитает работать со структурой PIDL. Роль переводчика с человеческого языка на язык, понятный Windows Shell, выполняет метод ParseDisplayName():
lpszDisplayName: pOLESTR; out pchEaten: ULONG; out ppidl: PItemIDList; var dwAttributes: ULONG): HResult;
Первый параметр hwndOwner представляет собой дескриптор родительского окна; в него допускается передавать нулевое значение. Параметр pbcReserved резервный; передавайте в него неопределенный указатель nil. В основной параметр lpszDisplayName мы передаем указатель на строку с полным путем к объекту, например C:\MySuperFolder. Необязательный параметр pchEaten возвратит в переменную количество проанализированных методом символов. Результаты «перевода» файлового пути в так любимый оболочкой Windows идентификатор мы обнаружим в параметре ppidl. Последний параметр метода также необязателен, это набор флагов атрибутов.
Разберем простейший вариант использования метода ParseDisplayName():
function ConvertNameToPIDL(fName: string; var pidlObject: PItemIDList) : boolean;
var iDesktop: IShellFolder;
CharsDone: ULONG;
dwAttributes: DWORD;
WC : array[0..MAX_PATH-1] of WideChar;
StringToWideChar(fName, WC, MAX_PATH); //преобразуем строку в формат WideChar
if SHGetDesktopFolder(iDesktop)=S_OK then
if iDesktop.ParseDisplayName(0, nil, WC, CharsDone, pidlObject, dwAttributes)=S_OK then Result:=True else Result:=False;
end;
function ParseDisplayName(hwndOwner: HWND; pbcReserved: Pointer;
begin
Функция ConvertNameToPIDL() преобразует имя файлового объекта в список идентификаторов. Для обращения к методу ParseDisplayName() мы предварительно получаем указатель на интерфейс IShellFolder рабочего стола.