Поделиться через


Обработка сообщений и цели команд

Интерфейс IOleCommandTarget диспетчера команд определяет простой и расширяемый механизм для запроса и выполнения команд. Этот механизм проще, чем автоматизация IDispatch , так как она полностью зависит от стандартного набора команд; команды редко имеют аргументы, а сведения о типе не используются (безопасность типов также уменьшается для аргументов команд).

В конструкторе интерфейса диспетчера команд каждая команда принадлежит к "группе команд", которая сама по себе идентифицируется с идентификатором GUID. Таким образом, любой пользователь может определить новую группу и определить все команды в этой группе без необходимости координировать работу с корпорацией Майкрософт или любым другим поставщиком. (Это, по сути, то же самое средство определения, что и dispinterface и dispIDs в службе автоматизации. Здесь есть перекрытие, хотя этот механизм маршрутизации команд предназначен только для маршрутизации команд, а не для сценариев и программирования в большом масштабе, как дескриптор автоматизации.)

IOleCommandTarget обрабатывает следующие сценарии:

  • Когда объект активируется на месте, отображаются только панели инструментов объекта, а панели инструментов объекта могут иметь кнопки для некоторых команд контейнера, таких как печать, предварительный просмотр, сохранение, создание, масштабирование и т. д. (Стандарты активации на месте рекомендуют удалять такие кнопки с их панелей инструментов или по крайней мере отключать их. Эта конструкция позволяет включить эти команды и все же перенаправить их в правильный обработчик.) В настоящее время для объекта нет механизма отправки этих команд в контейнер.

  • Если активный документ внедрен в активный контейнер документов (например, Привязка Office), контейнер может потребоваться отправить такие команды, как печать, настройка страницы, свойства и другие в содержащийся активный документ.

Эту простую маршрутизацию команд можно обрабатывать с помощью существующих стандартов автоматизации и IDispatch. Тем не менее, затраты, связанные с IDispatch этим, больше, чем необходимы здесь, поэтому IOleCommandTarget предоставляет более простые средства для достижения одинаковых целей:

interface IOleCommandTarget : IUnknown
    {
    HRESULT QueryStatus(
        [in] GUID *pguidCmdGroup,
        [in] ULONG cCmds,
        [in,out][size_is(cCmds)] OLECMD *prgCmds,
        [in,out] OLECMDTEXT *pCmdText);
    HRESULT Exec(
        [in] GUID *pguidCmdGroup,
        [in] DWORD nCmdID,
        [in] DWORD nCmdExecOpt,
        [in] VARIANTARG *pvaIn,
        [in,out] VARIANTARG *pvaOut);
    }

В этом методе QueryStatus проверяется, поддерживается ли определенный набор команд, который определяется с помощью GUID. Этот вызов заполняет массив значений OLECMD (структур) поддерживаемым списком команд, а также возвращает текст, описывающий имя команды и /или сведения о состоянии. Когда вызывающий объект хочет вызвать команду, он может передать команду (и задать GUID) Exec вместе с параметрами и аргументами, возвращая возвращаемое значение.

См. также

Контейнеры активных документов