Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОСиСП - методички / OS&SP_Lab_2.6(shell).doc
Скачиваний:
95
Добавлен:
18.05.2015
Размер:
1.12 Mб
Скачать

Пример 8 «Добавление колонки в окно детального просмотра Проводника» Детальный просмотр в Windows 2000

Windows 2000 добавляет много настроечных опций к детальному просмотру в Проводнике. Возможны 37 различных столбцов. Вы можете включать и исключать столбцы двумя путями. Во-первых, в контекстном меню выводятся 8 столбцов, если вы щелкаете правой кнопкой мыши на заголовке столбца:

Если вы выбираете More..., Проводник отображает диалог, где вы можете выбирать уже из всех доступных столбцов:

Проводник позволяет нам добавить столбцы к списку в этом диалоге с помощью специального расширения. Однако расширения не могут добавлять столбцы к списку в контекстном меню.

Демонстрационный проект для этой статьи - расширение, добавляющее для MP3 файлов столбцы, отображающие различные поля из тэгов ID3 (версии 1), которые могут быть сохранены в файлах MP3.

Использование AppWizard

Запустите AppWizard и создайте новый ATL COM проект. Назовем его MP3TagViewer. Щелкните ОК, чтобы перейти к первому (и единственному) диалогу мастера. Сохраните все установки по умолчанию и щелкните Finish. Теперь у нас есть пустой ATL проект, который построит DLL, но нам необходимо еще добавить наш COM объект-расширение. В дереве ClassView щелкните правой кнопкой мыши на пункте MP3TagViewer classes и укажите New ATL Object.

В мастере ATL Object на первой панели уже выбран Simple Object, поэтому просто щелкните Next. На второй панели в поле редактирования Short Name введите MP3ColExt и щелкните ОК (остальные поля заполнятся автоматически). Эти действия создадут класс CMP3ColExt, который содержит основной код для реализации COM объектов. Мы добавим наш код в этот класс.

Интерфейс расширения

Наше расширение для добавления столбцов реализует только один интерфейс, IColumnProvider. Нет отдельной инициализации через IShellExtInit или IPersistFile, как в других расширениях, т.к. это расширение для папки, которое никак не использует текущий выбранный элемент. Оба интерфейса, IShellExtInit и IPersistFile связаны с понятием чего-то выбранного. В нашем случае инициализация выполняется через метод интерфейса IColumnProvider.

Чтобы добавить поддержку IColumnProvider к нашему COM-объекту, откройте MP3ColExt.h и добавьте выделенные строки:

#include <comdef.h>

#include <shlobj.h>

#include <shlguid.h>

struct __declspec(uuid("E8025004-1C42-11d2-BE2C-00A0C9A83DA1")) IColumnProvider;

/////////////////////////////////////////////////////////////////////////////

// CMP3ColExt

class ATL_NO_VTABLE CMP3ColExt :

public CComObjectRootEx<CComSingleThreadModel>,

public CComCoClass<CMP3ColExt, &CLSID_MP3ColExt>,

public IMP3ColExt,

public IColumnProvider

{

BEGIN_COM_MAP(CMP3ColExt)

COM_INTERFACE_ENTRY(IMP3ColExt)

COM_INTERFACE_ENTRY(IColumnProvider)

END_COM_MAP()

public:

// IColumnProvider

STDMETHOD (Initialize)(LPCSHCOLUMNINIT psci) { return S_OK; }

STDMETHOD (GetColumnInfo)(DWORD dwIndex, SHCOLUMNINFO* psci);

STDMETHOD (GetItemData)(LPCSHCOLUMNID pscid, LPCSHCOLUMNDATA pscd, VARIANT* pvarData);

};

Обратите внимание, что объявление IColumnProvider находится перед объявлением класса. Этот порядок необходим для работы макроса COM_INTERFACE_ENTRY. Кто-то в Microsoft забыл определить UUID для IColumnProvider в comdef.h, поэтому нам необходимо сделать это объявление самим. В ATL есть макрос COM_INTERFACE_ENTRY_IID для использования в такой ситуации, когда для символа нет UUID, назначенного посредством __declspec(uuid()), однако, когда я использовал этот макрос, все заканчивалось передачей проводником недействительного указателя в IDispatch::GetTypeInfo(), и, в результате, аварией расширения.

Нам также необходимо сделать некоторые изменения в stdafx.h. Поскольку мы используем новые возможности Win 2000, мы должны определить несколько макросов, чтобы получить доступ к декларациям и прототипам, связанным с этими возможностями:

#define WINVER 0x0500 // W2K/98

#define _WIN32_WINNT 0x0500 // W2K

#define _WIN32_IE 0x0500 // IE 5+

Соседние файлы в папке ОСиСП - методички