消息处理和命令目标
命令调度接口 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
以及选项和参数,从而获取返回值。
另请参阅
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈