消息处理和命令目标

命令调度接口 IOleCommandTarget 定义一种简单且可扩展的机制,用于查询和执行命令。 此机制比自动化 IDispatch 更简单,因为它完全依赖于一组标准命令;命令很少具有参数,并且不涉及任何类型信息(命令参数的类型安全性也会减少)。

在命令调度接口设计中,每个命令都属于一个“命令组”,该组本身使用 GUID 进行标识。 因此,任何人都可以定义新组并定义该组中的所有命令,而无需与Microsoft或任何其他供应商协调。 zh-CN: (这实质上与自动化中的 dispinterfacedispIDs 的定义方式相同。此处存在重叠,尽管此命令路由机制仅用于命令路由,而不像自动化那样处理大规模的脚本编写/可编程性。)

IOleCommandTarget 处理以下情境:

  • 当对象就地激活时,通常只显示对象的工具栏,并且对象的工具栏可能具有某些容器命令的按钮,例如 打印打印预览保存新建缩放等。 (就地激活标准建议对象从工具栏中删除此类按钮,或至少禁用这些按钮。此设计允许启用这些命令,但路由到正确的处理程序。目前,对象没有将这些命令调度到容器的机制。

  • 当活动文档嵌入活动文档容器(如 Office Binder)中时,容器可能需要将命令(如 打印页面设置属性和其他内容)发送到包含的活动文档。

可以通过现有的自动化标准和 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,并获得一个返回值。

另请参阅

活动文档容器