Zpracování zpráv a cíle příkazů
Rozhraní IOleCommandTarget
pro odesílání příkazů definuje jednoduchý a rozšiřitelný mechanismus pro dotazování a spouštění příkazů. Tento mechanismus je jednodušší než automatizace IDispatch
, protože je zcela závislý na standardní sadě příkazů; příkazy zřídka mají argumenty a nejsou zapojeny žádné informace o typu (bezpečnost typů se také snižuje pro argumenty příkazů).
V návrhu rozhraní pro odesílání příkazů každý příkaz patří do "skupiny příkazů", která je sama identifikována identifikátorem GUID. Proto může kdokoli definovat novou skupinu a definovat všechny příkazy v této skupině bez nutnosti koordinovat s Microsoftem nebo jiným dodavatelem. (To je v podstatě stejný způsob definice jako dispinterface plus dispID ve službě Automation. Tento mechanismus směrování příkazů se zde překrývají, i když je tento mechanismus směrování příkazů určený pouze pro směrování příkazů a ne pro skriptování nebo programovatelnost ve velkém měřítku jako obslužné rutiny automation.)
IOleCommandTarget
zpracovává následující scénáře:
Když je objekt aktivovaný na místě, zobrazí se obvykle jenom panely nástrojů objektu a panely nástrojů objektu můžou obsahovat tlačítka pro některé příkazy kontejneru, jako je Tisk, Náhled, Uložit, Nový, Lupa a další. (Místní aktivační standardy doporučují, aby objekty odebraly taková tlačítka z panelů nástrojů nebo aby je alespoň zakázaly. Tento návrh umožňuje povolit tyto příkazy a přesto směrovat na správnou obslužnou rutinu.) V současné době neexistuje žádný mechanismus pro odeslání těchto příkazů do kontejneru.
Pokud je aktivní dokument vložen do aktivního kontejneru dokumentů (například Office Binder), může být nutné odeslat příkazy, jako je Tisk, Vzhled stránky, Vlastnosti a další, do obsaženého aktivního dokumentu.
Toto jednoduché směrování příkazů lze zpracovat prostřednictvím stávajících standardů Automation a IDispatch
. Režijní náklady, které IDispatch
se týkají, je však více, než je zde nezbytné, takže IOleCommandTarget
poskytuje jednodušší způsob, jak dosáhnout stejných konců:
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);
}
Metoda QueryStatus
zde testuje, zda je podporována konkrétní sada příkazů, která je identifikována identifikátorem GUID. Toto volání vyplní pole hodnot OLECMD podporovaným seznamem příkazů a vrátí text popisující název příkazu nebo informace o stavu. Když volající chce vyvolat příkaz, může předat příkaz (a nastavený identifikátor GUID) Exec
společně s možnostmi a argumenty a získat zpět návratovou hodnotu.