消息处理和命令目标

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

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

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 以及选项和参数,从而获取返回值。

另请参阅

活动文档容器