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.