Вопросами визуального представления текущей папки в родительском окне Wnd ведает метод:
function CreateViewObject(wnd: HWND; const riid: TGUID; out ppvOut: Untyped) : HRESULT;
Константа интерфейса создаваемого объекта передается во второй аргумент. Указатель на созданный объект возвращается в третьем параметре ppvOut.
Описание объекта
За информацией об атрибутах одного или более объектов обращаются к методу:
function GetAttributesOf(cidl: UINT; var apidl: PItemIDList; var rgfInOut: UINT): HResult;
Здесь cidl - номер файлового объекта, чьими атрибутами мы интересуемся; apidl - адрес массива указателей на структуры ITEMIDLIST, каждая из которых уникально идентифицирует файловый объект относительно родительской папки. Каждая структура ITEMIDLIST должна содержать одну структуру SHITEMID, завершающуюся нулем. Выходной параметр rgfInOut используется как для передачи в функцию данных, так и для возврата результатов ее работы. Как входной параметр он определяет, какие именно атрибуты мы планируем получить. Как выходной параметр он содержит запрашиваемые данные - комбинации флагов представлены в табл. 29.4.
Изменение имени объекта
Чтобы изменить имя файлового объекта или дочерней папки, обратитесь кметоду:
ШЙтсШ ИМ function SetNameOf(hwndOwner: HWND; pidl: PItemIDList; lpszName: POLEStr; uFlags: DWORD; var ppidlOut: PItemIDList): HResult;
Здесь hwndOwner - дескриптор окна, вместо которого допускается передавать нулевое значение; pidl - идентификатор обслуживаемого файлового объекта; lpszName - указатель на строку, содержащую новое название; uFlags -флаги. Например, флаг SHGDNNORMAL указывает, что речь идет о полном имени, SHGDNINFOLDER - относительное имя. Результат работы метода возвращается в последнем параметре в виде структуры ppidlOut.
Создание элемента пользовательского интерфейса
Поиск интерфейсов, позволяющих оперировать с данным объектом, можно осуществить через метод:
function GetUIObjectOf(hwndOwner: HWND; cidl: UINT; var apidl:
PItemIDList; const riid: TIID; prgfInOut: Pointer; out ppvOut): HResult;
Чаще всего этот метод используют для поиска связанных контекстных меню и операций drag-and-drop. Здесь hwndOwner - необязательный дескриптор на окно-владелец; cidl - количество файловых объектов или папок, определенных в параметре apidl. В свою очередь apidl - это указатель на структуру PItemIDList; riid - возвращаемый в результате выполнения метода идентификатор интерфейса, связанного с нашим файлом (папкой) объекта COM, например IContextMenu или IDropTarget. Параметр prgfInOut зарезервирован; ppvOut - указатель на интересующий нас интерфейс.
Резюме
В арсенале оболочки ОС Windows насчитывается более сотни COM-объектов и их интерфейсов. Среди них интерфейс активного рабочего стола IActive-Desktop, интерфейсы контекстного (IContextMenu) и всплывающего (IMenuPopup) меню, интерфейс инсталляции и деинсталляции приложений IShellApp, интерфейс ярлыка IShellLink и даже интерфейс записи данных на CD и DVD диски ICDBurn.
Мы познакомились лишь с верхушкой айсберга - интерфейсом папок IShellFolder. Кстати, начиная с ОС Windows 2000/Me библиотека оболочки Windows shell32.dll версии 5.0 поддерживает расширенный интерфейс IShellFolder.