Office Automation utilizando o Visual C++

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

Nesta página

Sumário

Este artigo responde a perguntas mais frequentes relativas a automatização para Microsoft Office a partir do Visual C++.

Mais Informação

Índice

  1. O que é a automatização?
  2. Estou a automatização, onde posso encontrar recursos boas para mais informações?
  3. Existem diferentes formas que pode utilizar a automatização?
  4. O que é COM?
  5. Como anexar à instância em execução de uma aplicação do Office?
  6. Como passar parâmetros opcionais?
  7. Como catch eventos expostos pelas aplicações do Office?
  8. O código de automatização é muito lento. Como posso acelerá coisas?
  9. O que significam estes valores de erro grande, como-2147352573 ou 0x80030002?
  10. O que é uma biblioteca de tipos?
  11. O código de automatização trabalhou em conjunto com o Microsoft Excel 95, mas falha com o Microsoft Excel 97. Por que razão?
  12. Por que razão a aplicação que estiver a automatizar permanecem memória depois de concluído o programa?
  13. Eu sei o pretende fazer como utilizador um aplicação do Microsoft Office, mas como posso fazer isto programaticamente utilizando a automatização?
  14. Pode automatizar uma aplicação do Microsoft Office incorporada?
  15. Como posso aceder as propriedades de documentos num documento do Microsoft Office?

Perguntas e respostas

  1. O que é a automatização?

    Automatização (anteriormente automatização OLE) é uma tecnologia que lhe permite tirar partido da funcionalidade de um programa existente e incorporar as suas próprias aplicações. Por exemplo, pode utilizar o Microsoft Word verificação ortográfica e gramatical capacidades para a aplicação sem visíveis para os utilizadores do Microsoft Word. Pode mesmo utilizar todas as ferramentas de análise de gráficos, impressão e dados do Microsoft Excel. Esta tecnologia bastante pode simplificar e acelerar o desenvolvimento.
  2. Estou a automatização, onde posso encontrar recursos boas para mais informações? Capítulo 24 de David Kruglinski "Inside Visual C++" (ISBN:1 565 - 57231- - 2) fornece uma descrição geral, bem como alguns exemplos excelentes. Além disso, a base de dados de conhecimento da Microsoft é uma boa fonte de informações. Este artigo propriamente dito é um boa início e pode localizar referências mais específicas no seguinte artigo na base de dados de conhecimento da Microsoft:
    152023Localizar recursos para automatização OLE de estudo
    Se preferir aprender através de exemplos, consulte o seguinte artigo na base de dados de conhecimento da Microsoft:
    179706COMO utilizar MFC para automatizar o Excel e criar/formatar um novo livro
  3. Existem diferentes formas que pode utilizar a automatização?

    Existem três formas básicas, pode utilizar a automatização: MFC, #import e C/C ++:

    • Com MFC, utilize o Visual ClassWizard C++ para gerar "classes de moldagem" a partir de bibliotecas de tipos do Microsoft Office. Estas classes, bem como outras classes MFC, tais como COleVariant, COleSafeArray COleException, simplificam as tarefas de automatização. Este método, normalmente, é recomendado a outros utilizadores e a maior parte dos exemplos da base de dados de conhecimento da Microsoft utiliza MFC.
    • #import, uma directiva nova que ficou disponível com o Visual C++ 5.0, cria VC ++ "ponteiros inteligentes" de uma biblioteca de tipo especificado. É muito poderosa, mas normalmente não recomendado devido a referência-contagem problemas que ocorrem normalmente quando utilizado com aplicações do Microsoft Office.
    • Automatização de C/C ++ é muito mais difícil, mas por vezes necessário para evitar a sobrecarga com MFC ou problemas com #import. Basicamente, trabalhar com estas APIs como CoCreateInstance() e COM interfaces como IDispatch e IUnknown.
    É importante ter em atenção que existem alguns ligeiras diferenças entre automatização a partir de C++ comparado com C simples, uma vez COM foi concebida em torno da classe de C++. Para mais informações, consulte o seguinte artigo na Microsoft Knowledge Base para um exemplo C:
    181473COMO: Utilizar a automatização OLE a partir de uma aplicação C
  4. O que é COM?

    Automatização é baseada em COM (Component Object modelo). COM é uma arquitectura de software padrão com base nas interfaces e concebidos para terem código separado em objectos autónomos. Considerá-la como uma extensão de paradigma OOP (objecto Oriented Programming), mas aplicável para separar as aplicações. Cada objecto expõe um conjunto de interfaces e todas as comunicações a um objecto, como, por exemplo, inicialização, notificações e transferência de dados, acontece através destas interfaces.

    COM também é um conjunto de serviços fornecidos por bibliotecas de ligação dinâmica (DLL) instaladas com o sistema operativo. Automatização utiliza muitos desses serviços. Um exemplo é o serviço "Marshalling", que pacotes de chamadas a aplicação de cliente para as funções de membro de interfaces da aplicação de servidor e transmite os utilizadores, com os respectivos argumentos, para a aplicação de servidor. Torna a que pareça que interfaces o servidor expostos no espaço de memória do cliente, que não é o caso quando o cliente é uma .exe em execução no seu próprio espaço de processo. Marshalling também obtém os valores de retorno de métodos do servidor novamente através de limites de processos e com segurança mãos das chamadas do cliente. Existem muitos outros serviços essenciais à automatização fornecidos pelas bibliotecas COM vários. Fontes de informação sobre os incluem "Inside OLE - segunda edição" Kraig Brockschmidt, ISBN 1-55615-843-2, "Inside COM" por Dale Rogerson - ISBN 1-57231-349-8, e "automatização referência para programadores," ISBN 1-57231-584-9.
  5. Como anexar à instância em execução de uma aplicação do Office?

    Utilize GetActiveObject() API. Servidores de automatização registem no ROT (com o objecto de tabela), através da API RegisterActiveObject(). Clientes de automatização podem obter com instância em execução com o código como:
          // Translate server ProgID into a CLSID. ClsidFromProgID
          // gets this information from the registry.
          CLSID clsid;
          CLSIDFromProgID(L"Excel.Application", &clsid);  
    
          // Get an interface to the running instance, if any..
          IUnknown *pUnk;
          HRESULT hr = GetActiveObject(clsid, NULL, (IUnknown**)&pUnk);
    
          ASSERT(!FAILED(hr));
    
          // Get IDispatch interface for Automation...
          IDispatch *pDisp;
          hr = pUnk->QueryInterface(IID_IDispatch, (void **)&pDisp);
          ASSERT(!FAILED(hr));
    
          // Release the no-longer-needed IUnknown...
          pUnk->Release();
    
    						
    Nota : Se existirem várias instâncias em execução da aplicação do Office que pretende anexar, apenas conseguirá anexar a primeira ocorrência que foi iniciada utilizando a API GetActiveObject().

    Em teoria, pode iterar ROT para cada instância individual, mas as aplicações do Office não registarem próprios se outra instância já consta da ROT porque moniker próprio é sempre a mesma (não puderam ser distinguida mesmo assim). Isto significa que não é possível anexar a todas as ocorrências, excepto para o primeiro. No entanto, uma vez que as aplicações do Office também registar os documentos a ROT, é possível com êxito anexar a outras instâncias por iteração ROT à procura de um documento específico, anexar, em seguida, obter o objeto Application de. Existe algum código no seguinte artigo da base de dados de conhecimento da Microsoft para iterar a ROT e procurar um nome de um documento:
    190985COMO: Obter IDispatch de um documento do Word ou de Excel a partir de um OCX
    Não tem fazer para o PowerPoint, porque é uma aplicação de ocorrência única; só pode ter uma instância da sua execução.
  6. Como passar parâmetros opcionais?

    Alguns métodos têm parâmetros "opcionais". No Visual Basic, é possível casual omiti-los ao chamar o método. No entanto, quando chamada com o Visual C++ tem de passar uma VARIANT especial cujo campo .VT é VT_ERROR e campo .scode é DISP_E_PARAMNOTFOUND. Ou seja:
          // VARIANT used in place of optional-parameters.
          VARIANT varOpt;
          varOpt.vt = VT_ERROR;
          varOpt.scode = DISP_E_PARAMNOTFOUND;
    						
    trata-se realmente o Visual Basic está a fazer de segundo plano.
  7. Como catch eventos expostos pelas aplicações do Office?

    Basicamente implementa a interface eventos que pretende chamar (o "receptor") e configurar uma ligação de aviso com a aplicação (a "origem"). O seguinte artigo dá-lhe exemplos passo a passo para o Microsoft Word:
    183599COMO: Apanha a eventos de aplicações Microsoft Word97 utilizar VC ++
    Em geral, para configurar a ligação de aviso, pode obter IConnectionPointContainer do servidor e chamar FindConnectionPoint() com o IID da interface de eventos. Isso proporciona uma interface IConnectionPoint e tudo o que é esquerda está a chamar Advise() com uma instância de interface de eventos. O servidor irá, em seguida, chamada novamente através desta interface quando estes eventos ocorrerem.
  8. O código de automatização é muito lento. Como posso acelerá coisas?

    Uma causa comum dos problemas de velocidade com a automatização é com repetitivas de leitura e escrita de dados. Isto é normal para automatização do Excel clientes. No entanto, a maioria das pessoas não estão em atenção que estes dados podem normalmente ser escritos ou lidos simultaneamente SEGURA. Consulte os seguintes artigos da base de dados de conhecimento da Microsoft para obter mais informações e exemplos informativos:
    186120COMO: Utilizar MFC para automatizar o Excel e preencher um intervalo com uma matriz
    186122COMO: Utilizar MFC para automatizar o Excel e obter uma matriz a partir de um intervalo
    179706COMO: Utilizar MFC para automatizar o Excel e criar/formatar um novo livro
    Além disso, é importante destacar que utilizar a área de transferência, por vezes, melhorem o desempenho. Por exemplo, pode copiar os dados para a área de transferência e, em seguida, utilizar a automatização para indicar o servidor para colar. Ou vice-versa; informar o servidor da área de cópia-a-transferência e colá-a aplicação.
  9. O que significam estes valores de erro grande, como-2147352573 ou 0x80030002?

    Estes valores são conhecidos como HRESULTs e são definidos em winerror.h. Os números são tão grandes porque representa o primeiro bit quer ou não é um resultado de erro. Pode utilizar o utilitário ErrLook.Exe fornecido com o Visual C++ para converter estes números em descrições significativas.

    Se pretender obter programaticamente uma descrição para os erros, pode utilizar a API FormatMessage(). Consulte os seguintes artigos da base de dados de conhecimento da Microsoft para obter mais informações e exemplos na utilização de FormatMessage():
    186063INFO: Converter erros de automatização de VB/VBA
    122957EXEMPLO: Decode32 e Decode16 OLE código de erro do descodificador ferramentas
    Nota : Se estiver a utilizar o Visual C++ 6.0 e ter uma variável que contém este valor na janela de monitorização de depuração, acrescentar ", hr" (sem as aspas) para o mesmo para que o Visual C++, converter para!
  10. O que é uma biblioteca de tipos?

    Uma biblioteca de tipos é semelhante a um ficheiro de cabeçalho C/C ++. Contém as interfaces, métodos e propriedades de publicação de um servidor. Pode ver a biblioteca de tipos com o objecto OLE/COM Viewer (Oleview.exe) fornecido com o Visual C++. Eis uma lista de nomes de ficheiros de biblioteca de tipo para o Microsoft Office 95, 97 e 2000:
    
           Office Application      | Type library
           ------------------------+----------------
           Word 95 and prior       | wb70en32.tlb
           Excel 95 and prior      | xl5en32.olb
           Powerpoint 95 and prior | Powerpoint.tlb
           Access 95 and prior     | msaccess.tlb
           Binder 95               | binder.tlb
           Schedule+               | sp7en32.olb
           Project                 | pj4en32.olb
           Team Manager            | mstmgr1.olb
           Word 97                 | msword8.olb
           Excel 97                | excel8.olb
           Powerpoint 97           | msppt8.olb
           Access 97               | msacc8.olb
           Binder 97               | msbdr8.olb
           Graph 97                | graph8.olb
           Outlook 97              | msoutl8.olb
           Outlook 98              | msoutl85.olb
           Word 2000               | msword9.olb
           Excel 2000              | excel9.olb
           Powerpoint 2000         | msppt9.olb
           Access 2000             | msacc9.olb
           Outlook 2000            | msoutl9.olb
           Word 2002               | msword.olb
           Excel 2002              | excel.exe
           Powerpoint 2002         | msppt.olb
           Access 2002             | msacc.olb
           Outlook 2002            | msoutl.olb 
    
    
    						
  1. O código de automatização trabalhou em conjunto com Excel 95, mas falha com o Excel 97. O que está a acontecer?

    O modelo de objecto para o Excel efectuada uma alteração significativa da versão 95 para 97. Excel 95 implementada todos os respectivos métodos e propriedades de uma única implementação de IDispatch. Isso significava que muitas vezes, pode chamar métodos que se destinam ao objecto X, Y do objecto. Não foi um bom design, no Office 97, cada objecto tem as suas próprias separar IDispatch implementação. Isto significa que se solicite um método ou propriedade do objecto X de um objecto independente Y, obtiver o erro 0x80020003,-2147352573, "Membro não encontrado". Para evitar este erro, terá de certificar de que a interface IDispatch subjacente que estiver a efectuar chamadas de é semanticamente correcta. Consulte os seguintes artigos da base de dados de conhecimento da Microsoft para obter mais informações:
    172108COMO: Resolução de problemas "Membro não encontrado", 0x80020003 erro
  2. A aplicação que estiver a automatizar permanece na memória depois de concluído o programa. O que está a acontecer?

    Provavelmente, isto não é porque se esqueceu libertar uma interface adquirida e terá de controlar para baixo. Eis algumas sugestões gerais e acções a procura:

    • Se estiver a utilizar #import, é muito provável que é foi esteja a executar dos erros contagem de referência associados. Frequentemente vezes os erros podem ser trabalhados à volta, mas normalmente é preferido para utilizar um dos outros métodos de automatização. #import não funciona muito bem com as aplicações do Office, porque a bibliotecas e utilização são bastante complexas. Além disso, esses problemas de contagem de referência são difíceis de localizar uma vez que muitas chamadas de COM as nível de interface são segundo plano quando utilizar #import.
    • Verifique se estiver a chamar os métodos, como abrir ou novo, que devolvem um IDispatch * (LPDISPATCH) e ignorar o valor devolvido. Se, em seguida, é abandonar esta interface devolvido e terá de alterar o código de modo a libertar quando já não forem necessários.
    • Comentar gradualmente secções do código até o problema desaparece e adicioná-lo novamente cuidadosamente para controlar onde começa o problema.
    • Tenha em atenção que algumas aplicações continuará a ser executado se o utilizador tem "processadas" a aplicação. Se isto ocorrer enquanto estiver a automatizar, em seguida, a aplicação provavelmente permanecerá executar posteriormente. As aplicações do Office tem uma propriedade "UserControl" no objecto de aplicação que é possível leitura/escrita para alterar este comportamento.
    • Além disso, algumas aplicações irão decidir continuar em execução se suficiente interface de utilizador "acção" Ocorreu. Se são planeia a aplicação para sair, em seguida, chamar o método Quit() no objecto aplicação. O Word será encerrado independentemente da respectivo contagem de referência quando sair é chamado. Não é esperado COM comportamento. Excel, no entanto, será correctamente apenas ocultar próprio mas permanecerá em execução até que todas as interfaces pendentes são libertadas. Em geral, deverá libertar todas as referências pendentes e chamar apenas Quit() se pretender que a aplicação termine.
  3. Eu sei o pretende fazer como utilizador de aplicações do Office, mas como é fazer isto através de programação através de automatização?

    O que está interessado em é a que objectos, métodos e propriedades necessitam de utilizar. Aprender a navegar os modelos de objecto do Word, Excel e PowerPoint, com base no que quer como um utilizador, a melhor forma consiste em utilizar o gravador de macros. Basta escolher Macro\ 'Gravar nova macro' no menu ' Ferramentas ', executar a tarefa que está interessado e escolher Macro\ 'Terminar gravação'. Quando tiver terminado a gravar, escolha Macro\Macros no menu Ferramentas, seleccione a macro gravada e clique em Editar. Isto leva-o ao gerado código VBA que irá efectuar a tarefa que gravou. Lembre-se a macro gravada não será o código melhor possível na maioria dos casos, mas não é muito bem para um exemplo rápido.
  4. Pode automatizar uma aplicação do Office incorporada?

    Absolutamente. O truque é obter o ponteiro de IDispatch: Este é apresentado o Visual C++ técnico Nota: 39 (TN039). Consulte o seguinte artigo da base de dados de conhecimento da Microsoft para um exemplo passo a passo:
    184663COMO: Incorporar e automatizar a folha de cálculo Microsoft Excel com MFC
  5. Como posso aceder as propriedades de documentos num documento do Office?

    As propriedades do documento são acessíveis através de automatização ou directamente através de IPropertyStorage. Seguintes artigos da base de dados de conhecimento da Microsoft demonstram cada método:
    179494COMO: Utilizar a automatização para obter propriedades do documento incorporadas
    186898COMO: Ler propriedades do documento compostas directamente com VC ++

Propriedades

Artigo: 196776 - Última revisão: 13 de março de 2008 - Revisão: 7.0
A informação contida neste artigo aplica-se a:
  • Microsoft Visual C++ 2008 Express Edition
  • Microsoft Project 2000 Standard Edition
  • Microsoft Excel 2000 Standard Edition
  • Microsoft Visual C++ 4.0 Standard Edition
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 6.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
  • Microsoft Access 97 Standard Edition
  • Microsoft Excel 97 Standard Edition
  • Microsoft PowerPoint 97 Standard Edition
  • Microsoft Outlook 97 Standard Edition
  • Microsoft Word 97 Standard Edition
  • Microsoft Access 2000 Standard Edition
  • Microsoft PowerPoint 2000 Standard Edition
  • Microsoft Outlook 2000
  • Microsoft Word 2000 Standard Edition
  • Microsoft Access 2002 Standard Edition
  • Microsoft Excel 2002 Standard Edition
  • Microsoft PowerPoint 2002 Standard Edition
  • Microsoft Word 2002 Standard Edition
  • Microsoft Outlook 2002 Standard Edition
Palavras-chave: 
kbmt kbsweptvs2008 kbautomation kbfaq KB196776 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: 196776

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