Office automação usando Visual C++

Traduções deste artigo Traduções deste artigo
ID do artigo: 196776 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Neste artigo

Sumário

Este artigo responde perguntas comuns sobre automação para Microsoft Office do Visual C++.

Mais Informações

Índice analítico

  1. O que é automação?
  2. Estou novo para automação, onde posso encontrar bons recursos para saber mais?
  3. Há maneiras diferentes, usar automação?
  4. O que é COM?
  5. Como anexo para a instância em execução de um aplicativo do Office?
  6. Como eu passar parâmetros opcionais?
  7. Como eu capturar eventos expostos pelos aplicativos do Office?
  8. Meu código de automação está muito lento. Como posso acelerá coisas?
  9. O que significam esses valores de erro grande, como-2147352573 ou 0x80030002?
  10. O que é uma biblioteca de tipos?
  11. Meu código de automação trabalha com o Microsoft Excel 95, mas falha com o Microsoft Excel 97. Por quê?
  12. Por que o aplicativo que eu estou Automatizando permanecer na memória após meu programa?
  13. Eu sei o que quero fazer um usuário de aplicativo do Microsoft Office, mas como eu fazer isso programaticamente usando automação?
  14. Pode automatizar um aplicativo do Microsoft Office incorporado?
  15. Como faço para acessar Minhas propriedades de documento em um documento do Microsoft Office?

Perguntas e respostas

  1. O que é automação?

    Automação (anteriormente denominadas automação OLE) é uma tecnologia que lhe permite aproveitar a funcionalidade de um programa existente e incorporar seus próprios aplicativos. Por exemplo, você pode utilizar o Microsoft Word verificação ortográfica e gramatical recursos em seu aplicativo sem o Microsoft Word visível para os seus usuários. Você ainda pode usar todos os as ferramentas de análise de gráficos, impressão e dados do Microsoft Excel. Essa tecnologia pode simplificar bastante e acelerar o desenvolvimento.
  2. Estou novo para automação, onde posso encontrar bons recursos para saber mais? Capítulo 24 do "Dentro Visual C++ de David Kruglinski" (ISBN:1 565 - 57231- - 2) fornece uma visão geral, bem como alguns exemplos excelentes. Além disso, base de dados de Conhecimento é uma boa fonte de informações. Este artigo se um bom começo, e você pode localizar referências mais específicas no seguinte artigo na Base de dados de Conhecimento da Microsoft:
    152023Localizar recursos para automação de OLE de estudo
    Se você preferir aprendizado por exemplo, consulte o seguinte artigo na Base de dados de Conhecimento da Microsoft:
    179706COMO usar MFC para automatizar a & criar/formato Excel uma nova pasta de trabalho
  3. Há maneiras diferentes, usar automação?

    Você pode usar a automação de três maneiras básicas: MFC, # Import e C/C ++:

    • Com o MFC, use o ClassWizard Visual C++ para gerar "wrapper classes" de bibliotecas de tipos do Microsoft Office. Essas classes, bem como outras classes MFC, como COleVariant COleSafeArray, COleException, simplificam as tarefas de automação. Esse método é normalmente recomendado sobre as outras e a maioria dos exemplos da Base de dados de Conhecimento da Microsoft use MFC.
    • # Import, uma nova diretiva que se tornaram disponível com o Visual C++ 5.0, cria VC ++ "apontadores inteligentes" de uma biblioteca de tipo especificado. É muito eficiente, mas geralmente não é recomendado devido a referência-contagem problemas que geralmente ocorrem quando usado com aplicativos do Microsoft Office.
    • Automação de C/C ++ é muito mais difícil, mas às vezes, necessário para evitar sobrecarga com MFC ou problemas com # Import. Basicamente, você trabalha com essas APIs como CoCreateInstance() e interfaces COM como IUnknown e IDispatch.
    É importante observar que são algumas pequenas diferenças entre a automação do C++ comparado ao C simples, como COM foi criado em torno da classe do C++. Para obter mais informações, consulte o seguinte artigo na Base de dados de Conhecimento da Microsoft para obter um exemplo C:
    181473COMO: Utilizar a automatização OLE de um aplicativo C
  4. O que é COM?

    Automação é baseada no COM (modelo de objeto de componente). COM é uma arquitetura de software padrão com base em interfaces e projetado para ter código separado em objetos independentes. Pense nele como uma extensão do paradigma de programação orientada a objeto (OOP), mas aplicável para separar aplicativos. Cada objeto expõe um conjunto de interfaces e todas as comunicações a um objeto, como inicialização, notificações e transferência de dados, acontece através dessas interfaces.

    COM é também um conjunto de serviços fornecidos pelas bibliotecas de vínculo dinâmico (DLLs) instaladas com o sistema operacional. Automação usa muitos desses serviços. Um exemplo é o serviço de "Empacotamento", que pacotes chamadas do aplicativo cliente para as funções de membro das interfaces do aplicativo de servidor e passa aquelas, com seus argumentos, para o aplicativo servidor. Faz parecer que interfaces do servidor estão expostos no espaço de memória do cliente, que não é o caso quando o cliente é um .exe em execução no seu próprio espaço de processo. Empacotamento também obtém os valores de retorno de métodos do servidor novamente entre os limites de processo e com segurança nas mãos de chamada do cliente. Há muitos outros serviços essenciais para automação que são fornecidos pelas bibliotecas COM vários. Fontes de informações sobre os incluem "Inside Ole - Second Edition" por Kraig Brockschmidt, ISBN 1-55615-843-2, "Interna COM" por Dale Rogerson - ISBN 1-57231-349-8, e "automação referência do programador," ISBN 1-57231-584-9.
  5. Como anexo para a instância em execução de um aplicativo do Office?

    Use a API GetActiveObject(). Servidores de automação se registram no ROT (com tabela de objeto,) via a API RegisterActiveObject(). Clientes de automação podem chegar a 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();
    
    						
    Observação : se houver várias instâncias em execução do aplicativo Office que você deseja anexar, você só poderá anexar a primeira instância que foi iniciada usando a API GetActiveObject().

    Teoricamente, você pode iterar ROT para cada instância individual, mas os aplicativos do Office não registram se outra instância já estiver no ROT porque o moniker para si é sempre o mesmo (ele não pôde ser distintos mesmo assim). Isso significa que você não pode anexar a qualquer instância, exceto para o primeiro. No entanto, porque os aplicativos do Office também registrar seus documentos no ROT, você com êxito pode anexar a outras instâncias por iteração ROT procurando um documento específico, anexação a ele, em seguida, obter o objeto Application do-lo. Há algum código no seguinte artigo da Base de dados de Conhecimento da Microsoft para iterar a ROT e procurando por um nome de documento:
    190985COMO: Obter IDispatch de um documento de Word do Excel ou de um OCX
    Você não precisará fazer isso para o PowerPoint, porque ele é um aplicativo single-instance; você só pode ter uma instância em execução.
  6. Como eu passar parâmetros opcionais?

    Alguns métodos têm parâmetros "opcionais". No Visual Basic, você pode acaso omiti-los ao chamar o método. No entanto, ao chamar com o Visual C++ você precisa passar um 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;
    						
    é realmente o que o Visual Basic está fazendo bastidores.
  7. Como eu capturar eventos expostos pelos aplicativos do Office?

    Basicamente você implementa a interface de evento que você deseja capturar (o "coletor") e configurar uma conexão de comunicado com o aplicativo (a "origem"). O seguinte artigo lhe oferece exemplos passo a passo para o Microsoft Word:
    183599COMO: Catch Word97 Microsoft Application Events usando VC ++
    Em geral, para configurar a conexão de comunicado, obter IConnectionPointContainer do servidor e chamar FindConnectionPoint() com o IID da interface de eventos. Isso fornece uma interface de IConnectionPoint e tudo o que resta é chamar Advise() com uma instância da sua interface de eventos. O servidor, em seguida, chamará novamente através desta interface quando esses eventos ocorrerem.
  8. Meu código de automação está muito lento. Como posso acelerá coisas?

    Uma causa comum de problemas de velocidade com a automação é com leitura e gravação de dados repetitivos. Isso é normal para automação do Excel clientes. No entanto, a maioria das pessoas não estão cientes esses dados geralmente podem ser gravados ou lidos usando SAFEARRAY todos de uma vez. Consulte os artigos da Base de dados de Conhecimento da Microsoft seguintes para obter mais informações e exemplos informativos:
    186120COMO: Usar MFC para automatizar o Excel e preenchimento de um intervalo com uma matriz
    186122COMO: Usar MFC para automatizar o Excel e obter uma matriz de um intervalo
    179706COMO: Usar MFC para automatizar o Excel e criar/formato uma nova pasta de trabalho
    Além disso, é importante destacar que usando a área de transferência pode às vezes, melhorar o desempenho. Por exemplo, você pode copiar os dados para a área de transferência e usar a automação para informar o servidor para colar. Ou vice-versa; informar o servidor para copiar para área de transferência e colar em seu aplicativo.
  9. O que significam esses valores de erro grande, como-2147352573 ou 0x80030002?

    Esses valores são conhecidos como HRESULTs e estão definidos no winerror.h. Os números são tão grandes porque o primeiro bit representa se é um resultado de erro ou não. Você pode usar o utilitário ErrLook.Exe que vem com o Visual C++ para converter esses números em descrições significativas.

    Se você desejar obter uma descrição para os erros programaticamente, você pode usar a API FormatMessage(). Consulte os artigos da Base de dados de Conhecimento da Microsoft seguir para obter mais informações e exemplos sobre o uso de FormatMessage():
    186063INFO: Conversão erros de automação para VB/VBA
    122957EXEMPLO: Ferramentas de decodificador de código de erro OLE de Decode32 e Decode16
    Observação : se você estiver usando o Visual C++ 6.0 e tiver uma variável que contém esse valor na janela de inspeção de depuração, acrescentar ", hr" (sem as aspas) a ele para que o Visual C++ traduzi-la para você!
  10. O que é uma biblioteca de tipos?

    Uma biblioteca de tipos é semelhante a um arquivo de cabeçalho C/C ++. Ele contém as interfaces, métodos e propriedades que está publicando um servidor. Você pode exibir a biblioteca de tipos com o Visualizador do objeto OLE/COM (Oleview.exe) que vem com o Visual C++. Aqui está uma lista de nomes de biblioteca de arquivos 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. Meu código de automação trabalha com o Excel 95, mas falha com o Excel 97. O que está acontecendo?

    O modelo de objeto para o Excel fez uma alteração significativa de versão 95 para 97. Excel 95 implementado todos os seus métodos e propriedades em uma implementação única de IDispatch. Isso significava que freqüentemente você poderia chamar métodos de objeto X, do objeto Y. Isso não era um bom design, portanto, no Office 97, cada objeto tem seu próprio separar IDispatch implementação. Isso significa que, se você solicitar um método ou propriedade do objeto X de um objeto separado Y, você obtém o erro 0x80020003,-2147352573, "Membro não encontrado". Para evitar esse erro, você precisará verificar se a interface IDispatch subjacente que você estiver fazendo chamadas de é semanticamente correta. Consulte os seguintes artigos da Base de dados de Conhecimento da Microsoft para obter mais informações:
    172108COMO: Troubleshooting "Membro não encontrado", 0x80020003 erro
  2. O aplicativo que eu estou Automatizando permanece na memória após o programa. O que está acontecendo?

    Provavelmente, isso ocorre porque você esqueceu liberar uma interface de aquisição e você precisará controlá-la para baixo. Aqui estão algumas sugestões gerais e serem procura:

    • Se você estiver usando o # Import, é muito provável que você poderia estar em execução em um dos bugs de contagem de referência associados a ele. Muitas vezes, os bugs podem ser seguidos ao redor, mas geralmente é preferido para usar um dos outros métodos de automação. # Import não funciona muito bem com os aplicativos do Office, como suas bibliotecas de tipos e uso são bastante complexas. Além disso, esses problemas de contagem de referência são difíceis de rastrear porque muita as nível de interface COM chamadas são bastidores quando usando # Import.
    • Verificar se você estiver chamando qualquer métodos, como abrir ou novo, que retornam um IDispatch * (LPDISPATCH) e ignorando o valor de retorno. Se você estiver, em seguida, são Abandonando essa interface retornado e será necessário alterar seu código para que você liberá-lo quando não são mais necessários.
    • Comentar gradualmente seções do seu código até que o problema desaparece e adicioná-lo de volta criteriosamente para rastrear onde começa o problema.
    • Observe que alguns aplicativos permanecerá executando se o usuário tem "alterado" o aplicativo. Se isso ocorrer enquanto você estiver automatizando, em seguida, o aplicativo provavelmente permanecerá em execução posteriormente. Os aplicativos do Office tem uma propriedade "UserControl" no objeto de aplicativo que você pode leitura/gravação para alterar esse comportamento.
    • Além disso, alguns aplicativos decidirá permanecer executando se suficiente-interface do usuário "ação" ocorreu. Se pretende o aplicativo para sair, em seguida, chame seu método Quit() no objeto de aplicativo. O Word exibirá desligamento independentemente de sua contagem de referência quando sair é chamado. Isso não é esperado COM comportamento. Excel, no entanto, será corretamente apenas se esconder mas permaneça em execução até que todas as interfaces pendentes são lançadas. Em geral, você deve liberar todas as referências pendentes e somente chamar Quit() se pretender que o aplicativo para sair.
  3. Eu sei o que quero fazer um usuário de aplicativo do Office, mas como eu fazer isso programaticamente por meio de automação?

    O que você está interessado é quais objetos, métodos e propriedades que você precisa usar. A melhor maneira de aprender a navegar os modelos de objeto do Word, Excel e PowerPoint, com base em que você deseja fazer como um usuário, é usar o gravador de macro. Apenas escolher Macro\ 'Gravar nova macro' no menu ' Ferramentas ', executar a tarefa você está interessado e escolha Macro\ 'Parar gravação'. Quando você estiver terminar gravação, escolha Macro\Macros no menu Ferramentas, selecione a macro gravada e clique em Editar. Isso levará você para o código VBA gerado que irá realizar a tarefa que você registrou. Lembre-se a macro gravada não é o melhor código possível na maioria dos casos, mas ele faz muito bem para um exemplo rápido.
  4. Pode automatizar um aplicativo do Office incorporado?

    Absolutamente. O truque é obter o ponteiro IDispatch: isso é fornecido no Visual C++ técnico Observação 39 (TN039). Consulte o seguinte artigo Base de dados de Conhecimento Microsoft para obter um exemplo passo a passo sobre:
    184663COMO: Incorporar e automatizar uma planilha do Microsoft Excel com MFC
  5. Como faço para acessar Minhas propriedades de documento em um documento do Office?

    As propriedades de documento são acessíveis através de automação ou diretamente por meio de IPropertyStorage. Os seguintes artigos da Base de dados de Conhecimento Microsoft demonstram cada método:
    179494COMO: Utilizar a automatização para recuperar propriedades internas do documento
    186898COMO: Ler propriedades de documento composto diretamente com VC ++

Propriedades

ID do artigo: 196776 - Última revisão: quinta-feira, 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 traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes 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