После двухнедельного перерыва мы возвращаемся к нашим техническим статьям о библиотеках Windows 7. Это шестая по счету статья о библиотеках Windows 7. На данный момент вы должны быть знакомы с библиотеками Windows 7 и понимать их внутреннюю структуру и то, как они встраиваются в оболочку Windows. Вы знакомы с различными доступными моделями программирования, а также знаете, как использовать программируемые интерфейсы Windows Shell для работы с содержимым библиотек. В этой статьей мы рассмотрим вспомогательные функции библиотек Windows 7.
COM-объект IShellLibrary представляет библиотеки Windows 7. Этот интерфейс определяет методы создания и управления библиотеками. Вы можете работать непосредственно с COM-интерфейсом, но проще использовать более высокий уровень абстракции функций. Shobjidl.h предоставляет следующие вспомогательные функции библиотеки:
Примечание: Если вам интересно, как реализованы эти вспомогательные функции, просто откройте файл Shobjudl.h и поищите их там.
Используя эти вспомогательные функции, вы можете выполнить большинство операций управления без использования низкоуровневых API. Например, вы можете добавить папку в библиотеку используя SHAddFolderPathToLibrary, не вызывая ISHellLibrary::Commit(). Поскольку IShellLibrary является программируемым интерфейсом, основанным на COM, вам понадобится вызвать функцию CoInitialize. После вам необходимо использовать вспомогательные функции. Нижеприведенный фрагмент кода создает новую библиотеку, добавляет в нее папку и сохраняет файл определения библиотеки в папку библиотеки.
IShellLibrary *pLib; IShellItem *pSi;SHCreateLibrary(IID_PPV_ARGS(&pLib));SHAddFolderPathToLibrary( pLib, L"C:\\temp ");pLib ->SaveInKnownFolder( FOLDERID_Libraries, L"Test 1 Lib", LSF_MAKEUNIQUENAME, & pSi);
Вспомогательные функции не предоставляют всех возможностей интерфейса IShellLibrary. Работая напрямую с интерфейсом IShellLibrary, вы можете вывести или установить иконку библиотеки, используя GetIcon и SetIcon. Но куда более важно, что вы можете получить содержимое библиотеки, используя IShellLibrary:: GetFolders(), как то показано во фрагменте кода ниже.
IShellLibrary *pslLibrary;SHLoadLibraryFromKnownFolder( FOLDERID_PicturesLibrary, STGM_READ, IID_PPV_ARGS(&pslLibrary));IShellItemArray *psiaFolders;pslLibrary->GetFolders( LFF_FORCEFILESYSTEM, IID_PPV_ARGS(&psiaFolders));
В следующей статьей мы пройдемся по некоторым методам синхронизации содержимого библиотек.