Compartilhar via


Manipulação de mensagem e destinos de comando

A interface de expedição de comando IOleCommandTarget define um mecanismo simples e extensível para consultar e executar comandos. Esse mecanismo é mais simples que o IDispatch da Automação porque depende inteiramente de um conjunto padrão de comandos; os comandos raramente têm argumentos e nenhuma informação de tipo está envolvida (a segurança do tipo também é reduzida para argumentos de comando).

No design da interface de expedição de comando, cada comando pertence a um "grupo de comandos" que é identificado com um GUID. Portanto, qualquer pessoa pode definir um novo grupo e definir todos os comandos nesse grupo sem a necessidade de coordenar com a Microsoft ou qualquer outro fornecedor. (Trata-se essencialmente do mesmo meio de definição que uma dispinterface mais dispIDs na Automação. Há sobreposição aqui, embora esse mecanismo de roteamento de comando seja apenas para roteamento de comando e não para script/programação em grande escala como identificador de Automação.)

IOleCommandTarget trata os seguintes cenários:

  • Quando um objeto é ativado no local, geralmente apenas as barras de ferramentas do objeto são exibidas e as barras de ferramentas do objeto podem ter botões para alguns dos comandos de contêiner, como Imprimir, Visualização de Impressão, Salvar, Novo, Zoom e outros. (Os padrões de ativação no local recomendam que os objetos removam esses botões de suas barras de ferramentas ou pelo menos os desabilitem. Esse design permite que esses comandos sejam habilitados e ainda roteados para o manipulador correto.) Atualmente, não há mecanismo para o objeto despachar esses comandos para o contêiner.

  • Quando um documento ativo é inserido em um contêiner de documento ativo (como o Office Binder), o contêiner pode precisar enviar comandos como Impressão, Configuração de Página, Propriedades e outros para o documento ativo contido.

Esse roteamento de comando simples pode ser tratado por meio de padrões de Automação existentes e IDispatch. No entanto, a sobrecarga envolvida com IDispatch é mais do que o necessário aqui, portanto, IOleCommandTarget fornece um meio mais simples para alcançar os mesmos fins:

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);
    }

O método QueryStatus aqui testa se há suporte para um determinado conjunto de comandos, o conjunto identificado com um GUID. Essa chamada preenche uma matriz de valores OLECMD (estruturas) com a lista de comandos com suporte, bem como o texto que descreve o nome de um comando e/ou informações de status. Quando o chamador deseja invocar um comando, ele pode passar o comando (e o conjunto GUID) para Exec junto com opções e argumentos, obtendo de volta um valor retornado.

Confira também

Contêineres de documento ativos