Ағылшын тілінде оқу

Бөлісу құралы:


Регистрация и реализация обработчика листа свойств для типа файла

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

Что нужно знать

Технологии

  • Оболочка

Необходимые условия

  • Понимание контекстных меню

Инструкции

Шаг 1. Регистрация обработчика листа свойств для типа файла

Помимо обычной регистрации Component Object Model (COM), добавьте подраздел PropertySheetHandlers к подразделу shellex ключа ProgID приложения, связанного с типом файла. Создайте подраздел PropertySheetHandlers с именем обработчика и задайте значение по умолчанию в виде строковой формы GUID (идентификатор класса) обработчика свойств (CLSID).

Чтобы добавить несколько страниц на лист свойств, зарегистрируйте обработчик для каждой страницы. Максимальное количество страниц, которые может поддерживать лист свойств, составляет 32. Чтобы зарегистрировать несколько обработчиков, создайте ключ под ключом shellex для каждого обработчика, при этом значение по умолчанию должно соответствовать GUID CLSID обработчика. Не обязательно создать отдельный объект для каждого обработчика, что означает, что несколько обработчиков могут иметь одно и то же значение GUID. Страницы будут отображаться в том порядке, в котором их ключи перечислены в разделе shellex.

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

HKEY_CLASSES_ROOT
   .myp
      (Default) = MyProgram.1
   CLSID
      {Page 1 Property Sheet Handler CLSID GUID}
         InProcServer32
            (Default) = C:\MyDir\MyPropSheet1.dll
            ThreadingModel = Apartment
      {Page 2 Property Sheet Handler CLSID GUID}
         InProcServer32
            (Default) = C:\MyDir\MyPropSheet2.dll
            ThreadingModel = Apartment
   MyProgram.1
      (Default) = MyProgram Application
      shellex
         PropertySheetHandlers
            MyPropSheet1
               (Default) = {Page1 Property Sheet Handler CLSID GUID}
            MyPropSheet2
               (Default) = {Page2 Property Sheet Handler CLSID GUID}

Шаг 2. Реализация обработчика листа свойств для типа файла

Помимо общей реализации, описанной в как работают обработчики листов свойств, обработчик листа свойств для типа файла также должен иметь соответствующую реализацию интерфейса IShellPropSheetExt. Только метод IShellPropSheetExt::AddPages нуждается в реализации nontoken. Оболочка не вызывает IShellPropSheetExt::ReplacePage.

Метод IShellPropSheetExt::AddPages позволяет обработчику листа свойств добавить страницу на лист свойств. Метод имеет два входных параметра. Первая функция lpfnAddPage— это указатель на функцию обратного вызова AddPropSheetPageProc, которая используется для предоставления оболочке сведений, необходимых для добавления страницы в лист свойств. Во-вторых, lParam, — это определенное оболочкой значение, которое не обрабатывается обработчиком. Это просто возвращается к системе Shell при вызове функции обратного вызова.

Общая процедура реализации AddPages выглядит следующим образом.

Реализация метода AddPages

  1. Назначьте соответствующие значения членам структуры PROPSHEETPAGE. В частности:
    • Назначьте переменную, содержащую число ссылок обработчика, элементу pcRefParent. Эта практика предотвращает выгрузку объекта обработчика во время отображения листа свойств.
    • Вы также можете реализовать функцию обратного вызова PropSheetPageProc и присвоить её указатель члену pfnCallback. Эта функция вызывается при создании страницы и когда она будет уничтожена.
  2. Создайте дескриптор HPAGE страницы, передав структуру PROPSHEETPAGE в функцию CreatePropertySheetPage.
  3. Вызовите функцию, на которую указывает lpfnAddPage. Задайте первым параметром дескриптор HPAGE, который был создан на предыдущем шаге. Задайте для второго параметра значение lParam, переданное командой оболочки AddPages.
  4. Все сообщения, связанные со страницей, будут переданы процедуре диалогового окна, которая была назначена члену pfnDlgProc структуры PROPSHEETPAGE.
  5. Если вы назначили функцию обратного вызова PropSheetPageProc для pfnCallback, она будет вызываться, когда страница будет готова к уничтожению. Затем обработчик может выполнять любые необходимые операции очистки, такие как освобождение всех ссылок, которые он содержит.

В следующем примере кода показана простая реализация AddPages.

STDMETHODIMP CShellPropSheetExt::AddPages(LPFNADDPROPSHEETPAGE, lpfnAddPage, LPARAM lParam)
{
    PROPSHEETPAGE  psp;
    HPROPSHEETPAGE hPage;

    psp.dwSize        = sizeof(psp);
    psp.dwFlags       = PSP_USEREFPARENT | PSP_USETITLE | PSP_USECALLBACK;
    psp.hInstance     = g_hInst;
    psp.pszTemplate   = MAKEINTRESOURCE(IDD_PAGEDLG);
    psp.hIcon         = 0;
    psp.pszTitle      = TEXT("Extension Page");
    psp.pfnDlgProc    = (DLGPROC)PageDlgProc;
    psp.pcRefParent   = &g_DllRefCount;
    psp.pfnCallback   = PageCallbackProc;
    psp.lParam        = (LPARAM)this;

    hPage = CreatePropertySheetPage(&psp);
            
    if(hPage) 
    {
        if(lpfnAddPage(hPage, lParam))
        {
            this->AddRef();
            return S_OK;
        }
        else
        {
            DestroyPropertySheetPage(hPage);
        }
    }
    else
    {
        return E_OUTOFMEMORY;
    }
    return E_FAIL;
}

Переменная g_hInst — это дескриптор экземпляра библиотеки DLL, а IDD_PAGEDLG — идентификатор ресурса шаблона диалогового окна страницы. Функция pageDlgProc — это процедура диалогового окна, обрабатывающая сообщения страницы. Переменная g_DllRefCount содержит количество ссылок объекта. Метод AddPages вызывает AddRef для увеличения количества. Однако счетчик ссылок освобождается функцией обратного вызова, PageCallbackProc, когда страница должна быть уничтожена.

Замечания

Общие сведения о том, как зарегистрировать обработчики расширений оболочки, см. в разделе Создание обработчиков расширений оболочки.

IShellPropSheetExt