Обработка сообщений и цели команд
Интерфейс 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
вместе с параметрами и аргументами, возвращая возвращаемое значение.