訊息處理和命令目標
命令分派介面IOleCommandTarget定義簡單且可延伸的機制來查詢和執行命令。這項機制是自動化的時間比IDispatch因為它完全依賴一組標準的命令的方式。 命令很少會有引數,以及是否涉及任何類型的資訊 (型別安全會降低的命令引數)。
在命令分派介面設計中,每個命令都屬於 「 命令群組 」,其本身以識別 GUID。因此,任何人都可以定義新的群組,並不需要以協調向 Microsoft 或其他任何廠商的情況下該群組內的所有命令。(這是實質上相同的方式為定義的分配介面 加上 Dispid 在自動化。有是重疊,雖然路由機制,此指令只適用於命令傳送,不能用於指令碼/程式設計在大規模 Automation 控制代碼)。
IOleCommandTarget處理下列案例:
當物件是就地啟動時,只顯示物件的工具列通常會出現,當物件的工具列可能有一些容器命令類似的按鈕時列印, 列印預覽, 儲存, New, 拉,和其他人。(資料物件移除就地啟動標準中建議從他們的工具列,或在這種按鈕至少停用。可以這種設計讓這些命令可以啟用,而且傳送到正確的處理常式)。目前,沒有機制讓這些命令分派給容器的物件。
當主動式文件內嵌於主動式文件容器 (例如 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 與選項和引數,以及取回傳回值。