Алекс Jenter - Программирование на Visual C++. Архив рассылки

Здесь есть возможность читать онлайн «Алекс Jenter - Программирование на Visual C++. Архив рассылки» весь текст электронной книги совершенно бесплатно (целиком полную версию без сокращений). В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Жанр: Программирование, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

Программирование на Visual C++. Архив рассылки: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «Программирование на Visual C++. Архив рассылки»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

РАССЫЛКА ЯВЛЯЕТСЯ ЧАСТЬЮ
, НА САЙТЕ КОТОРОГО ВСЕГДА МОЖНО НАЙТИ ВСЮ НЕОБХОДИМУЮ РАЗРАБОТЧИКУ ИНФОРМАЦИЮ, СТАТЬИ, ФОРУМЫ, РЕСУРСЫ, ПОЛНЫЙ АРХИВ ПРЕДЫДУЩИХ ВЫПУСКОВ РАССЫЛКИ И МНОГОЕ ДРУГОЕ.

Программирование на Visual C++. Архив рассылки — читать онлайн бесплатно полную книгу (весь текст) целиком

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «Программирование на Visual C++. Архив рассылки», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Ниже представлена функция, позволяющая получить указатель на следующий элемент в списке идентификаторов. В случае неудачи возвращается пустой указатель.

#include

LPITEMIDLIST GetNextItemID(const LPITEMIDLIST pidl) {

size_t cb = pidl->mkid.cb;

if (cb == 0) {

return NULL;

}

pidl = (LPITEMIDLIST)(((LPBYTE)pidl) + cb);

if (pidl->mkid.cb == 0) {

return NULL;

}

return pidl;

}

За размещение списков идентификаторов отвечает распределитель памяти оболочки(Shell's allocator), предоставляющий интерфейс IMalloc. Указатель на данный интерфейс распределителя памяти оболочки можно получить через метод SHGetMalloc.

Таким образом, если Ваше приложение получает от оболочки PIDL-указатель, то оно становится ответственным за обязательное в дальнейшем освобождение этого списка с помощью распределителя памяти оболочки.

Ниже представлен пример копирования списка идентификаторов:

#include

size_t GetItemIDListSize(const LPITEMIDLIST pidl) {

size_t size = 0;

LPBYTE p = LPBYTE(pidl);

while (p != NULL) {

if (static_cast(p + size)->mkid.cb == 0) {

size += sizeof(USHORT); // size of terminator;

break;

}

size += static_cast(p + size)->mkid.cb;

}

return size;

}

LPITEMIDLIST CopyItemIDList(const LPITEMIDLIST pidl) {

LPMALLOC pMalloc;

LPITEMIDLIST pidlResult;

if (pidl == NULL) {

return NULL;

}

if (!SUCCEEDED(SHGetMalloc(&pMalloc)) {

return NULL;

}

size_t size = GetItemIDListSize(pidl);

pidlResult = pMalloc->Alloc(size);

if (pidlResult!= NULL) {

CopyMemory(pidlResult, pidl, size);

}

pMalloc->Release();

return pidlResult;

}

Для увеличения эффективности работы Ваших приложений рекомендуется брать ссылку на распределитель памяти оболочки при запуске приложения, и освобождать эту ссылку при выходе из приложения.

Интерфейс IShellFolderпредоставляет метод CompareIDsдля определения расположения двух идентификаторов относительно друг друга (выше, ниже или равны) в данной папке. При этом параметр lParam определяет критерий упорядочивания, но заранее определённым для всех объектов-папок является только сортировка по имени (значение 0). Если вызов этого метода завершён успешно, то поле CODE возвращаемого значения содержит ноль при равенстве объектов, отрицательно, если первое меньше второго, и положительно в обратном случае.

hr = ppsf->CompareIDs(0, pidlA, pidlB);

if (SUCCEEDED(hr)) {

iComparisonResult = short(HRESULT_CODE(hr))

}

Местонахождение объектов-папок

Некоторые папки имеют особое значение для оболочки. Для нахождения этих специальных папок, а также для того, чтобы пользователь мог сам искать необходимые ему папки, оболочка предоставляет специализированный набор функций:

SHGetDesktopFolder Возвращает интерфейс IShellFolderобъекта-папки "Рабочий стол" (Desktop);
SHGetSpecialFolderLocation Возвращает указатель на список идентификаторов специального объекта-папки.
SHBrowseForFolder Проводит диалог с пользователем и возвращает указатель на список идентификаторов выбранного пользователем объекта-папки;
SHGetSpecialFolderPath Версия 4.71. Возвращает путь файловой системы для специального объекта-папки. Функция предназначена для работы со специальнымипапками, а не для работы с виртуальными.

При отсутствии нужной папки может, по требованию приложения, её создавать.

Навигация по пространству имён

Каждый объект-папка прдоставляет Вам возможность перебора всех объектов, которыми данный объект владеет. Для этого Вам предоставляется метод EnumObjectsинтерфейса IShellFolder, который возвращает интерфейс-итератор IEnumIDList. При этом Вы можете ограничить список (включать папки, не папки, скрытые и системные объекты).

Описание методов интерфейса IEnumIDList:

Clone Создаёт новый объект-итератор, идентичный данному;
Next Восстанавливает указанное количество идентификаторов элементов, находящихся в папке;
Reset Возвращает итератор к началу последовательности;
Skip Пропускает указанное количество элементов;

Таким образом Вы сможете получить набор указателей на списки идентификаторов, причём эти списки будут относительнымипо отношению к папке-владельцу.

Чтобы получить интерфейс IShellFolderдля любого из этих объектов, Вам потребуется осуществить привязку, вызвав метод BindToObjectинтерфейса IShellFolderпапки-владельца.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «Программирование на Visual C++. Архив рассылки»

Представляем Вашему вниманию похожие книги на «Программирование на Visual C++. Архив рассылки» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Алексей Макеев - Смертельный архив
Алексей Макеев
libcat.ru: книга без обложки
Алексей Апухтин
Отзывы о книге «Программирование на Visual C++. Архив рассылки»

Обсуждение, отзывы о книге «Программирование на Visual C++. Архив рассылки» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x