Sdílet prostřednictvím


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.

Viz také

Kontejnery pro aktivní dokument