命令调度接口 IOleCommandTarget 定义一种简单且可扩展的机制,用于查询和执行命令。 此机制比自动化 IDispatch 更简单,因为它完全依赖于一组标准命令;命令很少具有参数,并且不涉及任何类型信息(命令参数的类型安全性也会减少)。
在命令调度接口设计中,每个命令都属于一个“命令组”,该组本身使用 GUID 进行标识。 因此,任何人都可以定义新组并定义该组中的所有命令,而无需与Microsoft或任何其他供应商协调。 zh-CN: (这实质上与自动化中的 dispinterface 和 dispIDs 的定义方式相同。此处存在重叠,尽管此命令路由机制仅用于命令路由,而不像自动化那样处理大规模的脚本编写/可编程性。)
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,并获得一个返回值。