Utilizar ligação antecipada e vinculação posterior na automatização

Traduções de Artigos Traduções de Artigos
Artigo: 245115 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sumário

Como ligar a um servidor de automatização pode afectar muitos itens num programa, como o desempenho, flexibilidade e maintainability.

Este artigo explica os tipos de ligação disponível para clientes de automatização e weighs ambos os lados de cada método.

Mais Informação

A automatização é um processo e/onde um componente de software comunica com ou controla outro componente de software da Microsoft a utilizar COM (Component Object Model). É a base para comunicação de componentes de acesso a sites a maior parte dos utilizados nos idiomas como, por exemplo, o Visual Basic ou Visual Basic for Applications e tornou-se uma parte normal da maior parte dos programas.

Historicamente, um objecto de automatização é qualquer objecto que suporta o IDispatch interface. Esta interface permite aos clientes chamar métodos e propriedades em tempo de execução sem ter de saber o objecto exacto estão a comunicar no momento da estruturação; um processo denominado enlace tardio. Hoje em dia, no entanto, o termo que objecto de automatização podem liquidar praticamente qualquer objecto COM, mesmo aqueles que não suportam IDispatch (e portanto não pode ser tardia). Este artigo pressupõe que o objecto é automatizar suporta ambos os métodos de ligação.

O que é a ligação?

A associação é um processo de correspondência de chamadas de função escritas pelo programador de código (interno ou externo) que implementa a função. É feito quando a aplicação está compilada e todas as funções chamadas no código devem ser ligadas antes do código pode ser executado.

Para compreender o processo, pense "enlace" em termos de publicar um livro. Imagine que o código é como o texto do livro onde um determinado parágrafo tiver escrito algo como "consulte o capítulo 12, página x para obter mais detalhes." Não souber o que é o número de página até que o livro estiver concluído, antes que de parágrafo pode ser lido como previsto, todas as páginas do livro devem ser ligadas em conjunto e o número de página correcta inserido no parágrafo. Aguardar o livro seja "ligada" antes de pode referenciar outras partes do livro.

Software de ligação é semelhante. O código é constituído por partes que necessitam de ser retirado em conjunto antes do código pode ser "lida." Enlace é o acto de substituir a função de nomes com endereços de memória (ou desfasamentos de memória para ser mais preciso) onde o código "passará para" quando a função é chamada. Para objectos COM, o endereço é um desvio de memória numa tabela de apontadores (chamada tabela de v) detido pelo objecto. Quando uma função COM for dependente, está dependente do índice v.

Estrutura de um objecto COM é simples. Quando o código contém uma referência a um objecto, contém um apontador indirecto para o início da tabela de v. A tabela de v é uma matriz de endereços de memória em que cada entrada é uma função diferente que pode ser chamada nesse objecto. Para chamar a função de terceira num objecto COM, ir para baixo três entradas na tabela e, em seguida, passar para a localização de memória especificada existe. Que executa o código de função e, quando terminar, volta novamente pronto para executar a seguinte linha de código.

+-[Code]------------+  +.................................[COM Object]...+
|                   |  : +-------------+                                :
|Set obj = Nothing -|--->| obj pointer |                                :
|                   |  : +-|-----------+                                :
+-------------------+  :   |   +-----------------+                      :
                       :   +-->| v-table pointer |                      :
                       :       +--|--------------+                      :
                       :          |                                     :
                       :          |  +----------------------------+     :
                       :  (3rd)   |  | Function 1 Address pointer |     :
                       : (Offset) |  +----------------------------+     :
                       :          |  | Function 2 Address pointer |     :
                       :          |  +----------------------------+     :
                       :          +->| Function 3 Address pointer |     :
                       :             +----------------------------+     :
                       +................................................+

				
o exemplo acima mostra o que acontece quando libertar um objecto COM. Uma vez que herdam todos os objectos COM de IUnknown, as primeiras três entradas na tabela são os métodos para IUnknown. Quando necessitar de libertar um objecto, o código chama a função terceira na tabela v (IUnknown::Release).

Felizmente, este trabalho é efectuado pelo Visual Basic em segundo plano. Como programador de Visual Basic, nunca tem de lidar com uma tabela v directamente. Mas, esta estrutura é como todos os objectos COM estão vinculados e é importante que está familiarizado com o mesmo para compreender o enlace é.

Enlace antecipado

O exemplo acima é o que é conhecido como antecipadamente (ou tabela v) enlace. Para todos os objectos COM, esta forma de enlace demora coloque sempre que é designado por interface IUnknown de um objecto COM. Mas o sobre as funções do objecto? Como se chamam? o método de actualização ou a propriedade principal Estas são funções personalizadas que são normalmente exclusivas do objecto. Se as localizações na tabela v não não assumido como, como encontrar os endereços de função necessários para chamá-los?

A resposta depende claro que, se sabe antecipadamente o aspecto v-tabela do objecto. Se o fizer, pode executar o processo de ligação antecipada mesmo métodos personalizados do objecto tal como fez para seus métodos de IUnknown. Este é o que geralmente destina por "-ligação antecipada."

Para utilizar o enlace inicial de um objecto, terá de conhecer o aspecto de respectiva tabela de v. No Visual Basic, pode efectuar isto adicionando uma referência a uma biblioteca de tipos que descreve o objecto, a interface (v-tabela) e todas as funções que podem ser chamadas no objecto. Uma vez que é efectuado, pode declarar um objecto como sendo um determinado tipo, em seguida, definir e usar esse objeto utilizando a tabela v. Por exemplo, se pretender automatizar Microsoft Office Excel utilizando o enlace inicial, faria adicione uma referência a "Microsoft Excel 8.0 Object Library" da caixa de diálogo Project|References e, em seguida, declarar a variável como sendo do tipo "Excel.Application." De momento, todas as chamadas efectuadas a variável de objecto deve estar vinculadas antecipadamente:
' Set reference to 'Microsoft Excel 8.0 Object Library' in
' the Project|References dialog (or Tools|References for VB4 or VBA).

' Declare the object as an early-bound object
  Dim oExcel As Excel.Application

  Set oExcel = CreateObject("Excel.Application")

' The Visible property is called via the v-table
  oExcel.Visible = True
				
este método funciona a grande maioria das vezes, mas o que acontece se não souber exactamente o objecto será utilizado no momento da estruturação? Por exemplo, o que acontece se necessita de contactar para várias versões do Excel ou possivelmente a um objecto "desconhecido" completamente?

Enlace dinâmico

COM inclui IDispatch. Objectos que implementam IDispatch são chamados para ter um dispinterface (se estiver a interface só suportam) ou interface dupla (se tiver uma interface personalizada que pode antecipadamente também ligar a). Diz-se os clientes que ligar IDispatch que são ser "tardia" porque a propriedade exacta ou o método que estão a chamar é determinado em tempo de execução utilizando os métodos de IDispatch localizá-los. Voltando ao livro de exemplo anterior, considerá-la como estando como uma nota de rodapé que direcciona para o índice, onde tem de "procurar"número de página em"tempo de leitura" em vez de ter que já imprimiu existe no texto.

A magia da interface é controlada pelas duas funções: GetIDsOfNames e Invoke. A primeira função mapeamentos de nomes (cadeias) a um identificador (denominado um dispid) que representa a função. Quando souber o ID de função que pretende ligar, pode chamá-lo utilizando a função Invoke. Esta forma de chamada do método é designado por "enlace tardio."

Novamente, no Visual Basic a forma que especificar como o objecto está ligado é a declaração de objecto. Se declarar uma variável de objecto como "Objecto" são, na realidade, o Visual Basic para utilizar IDispatch, indicando e são, por isso, ligação mais tarde:
' No reference to a type library is needed to use late binding.
' As long as the object supports IDispatch, the method can 
' be dynamically located and invoked at run-time.

' Declare the object as a late-bound object
  Dim oExcel As Object

  Set oExcel = CreateObject("Excel.Application")

' The Visible property is called via IDispatch
  oExcel.Visible = True
				
como pode ver o resto do código é o mesmo. A única diferença entre o enlace inicial e vinculação posterior (em termos de código de que escrever) é na declaração variável.

É importante notar que o que é "tardia" é a função a ser chamada e não a forma denomina-se. A partir de um debate anterior no enlace em geral, deve notar que IDispatch propriamente dito é "início dependente:" que é a dizer que Visual Basic efectua a chamada para definir a propriedade visível através de uma entrada de tabela v (IDispatch::Invoke) como estaria qualquer chamada COM. O próprio objecto COM é responsável pelo reencaminhamento a chamada para a função correcta para tornar o Excel visível. Este direccionamento indirecto permite que o cliente de Visual Basic compilá (vinculada, a uma função válida de endereço), mas ainda não conhece a função exacta que realmente irá efectuar o trabalho.

Enlace dispid

Alguns clientes (nitidamente mais MFC e 3.0 do Visual Basic, mas também Visual Basic 5.0 e 6.0 com respeitam para controlos ActiveX) utilizam um formulário híbrida atrasado de enlace de automatização denominada dispid enlace. Se for conhecido o objecto COM no momento da estruturação, dispids para as funções que são chamadas podem ser colocados em cache e transferidos directamente para IDispatch::Invoke sem ser necessário chamar GetIDsOfNames em tempo de execução. Isto pode aumentar significativamente desempenho, porque em vez de efectuar duas chamadas COM por função, só necessita de criar uma.

A associação dispid não é uma opção que pode normalmente no Visual Basic 5.0 ou 6.0. É utilizado para objectos que são referenciados na biblioteca de tipos, mas não contêm uma interface personalizada (ou seja, para objectos que têm apenas uma dispinterface) e para os agregados mas, em geral, Visual Basic utiliza a ligação antecipada qualquer lugar que normalmente utilizaria dispid enlace.

Que formato de ligação devo utilizar?

A resposta a esta pergunta depende quanto da estrutura do projecto como qualquer outra coisa. A Microsoft recomenda o enlace inicial em quase todos os casos. No entanto, poderão existir razões para escolher o enlace tardio.

Início do enlace é o método preferido. É a artista melhor porque a aplicação liga directamente o endereço da função a ser chamada e não existe não sobrecarga adicional de efectuar uma pesquisa de tempo de execução. Em termos de velocidade de execução global, é pelo menos duas vezes tão rápida como enlace tardio.

Enlace antecipado também fornece segurança de tipo. Quando tiver uma referência definida para a biblioteca de tipos do componente, o Visual Basic fornece suporte de IntelliSense para ajudá-lo correctamente o código de cada função. Visual Basic também avisa se o tipo de dados de um parâmetro ou valor devolvido é incorrecto, guardar muito tempo a quando escrever e depurar código.

Enlace tardio é ainda útil nas situações em que a interface exacta de um objecto não é conhecida no momento da estruturação. Se a aplicação de procura falar com vários servidores desconhecidos ou necessita de invocar funções por nome (utilizando a função do Visual Basic 6.0 CallByName por exemplo), em seguida, se necessitar utilizar o enlace tardio. Enlace tardio também é útil para resolver problemas de compatibilidade entre várias versões de um componente que tenha modificado ou adaptado a respectiva interface entre as versões incorrectamente.

As vantagens atribuídas a ligação antecipada tornam a melhor opção sempre que possível.

Manter a compatibilidade através de várias versões

Se vai utilizar um componente que não redistribua com o pacote de configuração e não é possível a garantia da versão exacta que irá estar a comunicar com em tempo de execução, deve prestar especial atenção para o enlace inicial a uma interface que seja compatível com todas as versões do componente ou (em alguns casos) utilize enlace tardio para chamar um método que pode existir numa determinada versão e falhar correctamente se esse método não está presente na versão instalada no sistema cliente.

Aplicações do Microsoft Office fornecem um bom exemplo desses servidores COM. As aplicações do Office normalmente expande as respectivas interfaces para adicionar novas funcionalidades ou falhas anteriores correctas entre versões. Se tiver de automatizar uma aplicação do Office, é recomendável que associa antecipadamente à versão mais antiga do produto que espera que pode ser instalado no sistema do cliente. Por exemplo, se tiver de ser possível automatizar o Excel 95, o Excel 97, Excel 2000 e Excel 2002, deverá utilizar a biblioteca de tipos para o Excel 95 (XL5en32.olb) para manter a compatibilidade com todas as três versões.

As aplicações do Office também demonstram que modelos de objectos com grandes interfaces duplos podem prejudicar limitações de marshalling em algumas plataformas. Para o código trabalhar melhor em todas as plataformas, utilize IDispatch. Para mais informações sobre como manter compatibilidade quando trabalhar com o Office aplicações, clique no número de artigo que se segue para visualizar o artigo na base de dados de conhecimento da Microsoft:
247579Utilizar ligação DISPID para automatizar a aplicações do Office sempre que possível

Referências

Para obter mais informações sobre COM, v tabelas e utilizar a automatização, consulte os seguintes livros:
Rogerson Dale, interior COM , MSPRESS, ISBN: 1-57231-349-8.

Curland, Matt, Avançadas do Visual Basic 6 , DevelopMentor, 0201707128.

Propriedades

Artigo: 245115 - Última revisão: 11 de maio de 2007 - Revisão: 7.2
A informação contida neste artigo aplica-se a:
  • Microsoft Office Ultimate 2007
  • Microsoft Office Enterprise 2007
  • Microsoft Office Professional 2007
  • Microsoft Office Professional Plus 2007
  • Microsoft Office Standard 2007
  • Microsoft Office Home and Student 2007
  • Microsoft Office Basic 2007
  • Microsoft Office 2003, All Editions
  • Microsoft Office XP Developer Edition
  • Microsoft Office 2000 Developer Edition
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
Palavras-chave: 
kbmt kbautomation kbinfo KB245115 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 245115

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com