ID do artigo: 183599 - Última revisão: segunda-feira, 12 de fevereiro de 2007 - Revisão: 4.4

Como capturar eventos de aplicativo do Word usando o Visual C++

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.
Expandir tudo | Recolher tudo

Sumário

Este artigo demonstra como capturar eventos de aplicativo 97 do Microsoft Word usando o Microsoft Visual C++. No entanto, os conceitos e código neste artigo não são específicas do Microsoft Word; elas são aplicáveis para o conjunto completo de aplicativos do Microsoft Office, bem como qualquer outro aplicativo que expõe eventos.

Mais Informações

As etapas a seguir ilustram como criar um MFC aplicativo captura os eventos de aplicativo do Microsoft Word 97 Startup() DocumentChange() e Quit():
  1. Criar um novo diálogo baseado em caixa aplicativo usando o MFC AppWizard. Nomeie o projeto WordEvents e aceitar as configurações padrão.
  2. Adicione dois botões para sua caixa de diálogo e nomeie os botões de "Iniciar e a instalação" e "Fechar e limpar," respectivamente.
  3. Adicione o seguinte código para um manipulador para o botão "Iniciar e a instalação":
          // Check to see if you've already started the server.
          if(m_app.m_lpDispatch != NULL) {
             AfxMessageBox("Server already started.");
             return;
          }
    
          char buf[256]; // General purpose buffer.
    
          // Start Automation server.
          COleException e;
          if(!m_app.CreateDispatch("Word.Application.8", &e)) {
             sprintf(buf, "Error on CreateDispatch(): %ld (%08lx)",
               e.m_sc, e.m_sc);
             AfxMessageBox(buf, MB_SETFOREGROUND);
             return;
    
          }
    
          // Make server visible through automation.
          // I.e.: Application.Visible = TRUE
          DISPID dispID;
          unsigned short *ucPtr;
          BYTE *parmStr;
          ucPtr = L"visible";
          m_app.m_lpDispatch->GetIDsOfNames(
               IID_NULL, &ucPtr, 1, LOCALE_USER_DEFAULT, &dispID
          );
          parmStr = (BYTE *)( VTS_VARIANT );
          m_app.InvokeHelper(
             dispID, DISPATCH_METHOD | DISPATCH_PROPERTYPUT, VT_EMPTY,
             NULL, parmStr, &COleVariant((short)TRUE)
          );
    
          // Declare the events you want to catch.
    
          // {000209F7-0000-0000-C000-000000000046}
          static const GUID IID_IWord8AppEvents =
          {0x000209f7,0x000,0x0000,{0xc0,0x00,0x0,0x00,0x00,0x00,0x00,0x46 } };
    
          //  Steps for setting up events.
          // 1. Get server's IConnectionPointContainer interface.
          // 2. Call IConnectionPointContainerFindConnectionPoint()
          //    to find the event you want to catch.
          // 3. Call IConnectionPoint::Advise() with the IUnknown
          //    interface of your implementation of the events.
    
          HRESULT hr;
    
          // Get server's IConnectionPointContainer interface.
          IConnectionPointContainer *pConnPtContainer;
          hr = m_app.m_lpDispatch->QueryInterface(
             IID_IConnectionPointContainer,
             (void **)&pConnPtContainer
          );
          ASSERT(!FAILED(hr));
    
          // Find connection point for events you're interested in.
          hr = pConnPtContainer->FindConnectionPoint(
             IID_IWord8AppEvents,
             &m_pConnectionPoint
          );
          ASSERT(!FAILED(hr));
    
          // Get the IUnknown interface of your event implementation.
          LPUNKNOWN pUnk = m_myEventSink.GetInterface(&IID_IUnknown);
          ASSERT(pUnk);
    
          // Setup advisory connection!
          hr = m_pConnectionPoint->Advise(pUnk, &m_adviseCookie);
          ASSERT(!FAILED(hr));
    
          // Release IConnectionPointContainer interface.
          pConnPtContainer->Release();
    					
  4. Adicione o seguinte código um manipulador para o botão "Sair e limpar":
          // Check if you've started the server.
          if(m_app.m_lpDispatch == NULL) {
             AfxMessageBox("You haven't started the server yet.");
             return;
          }
          m_pConnectionPoint->Unadvise(m_adviseCookie);
    
          // Tell server to quit.
          // Application.Quit()
          DISPID dispID;                   // Temporary DISPID
          unsigned short *ucPtr;           // Temporary name holder
          ucPtr = L"quit";
          m_app.m_lpDispatch->GetIDsOfNames(
    
               IID_NULL, &ucPtr, 1, LOCALE_USER_DEFAULT, &dispID
          );
    
          m_app.InvokeHelper(dispID, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
    
          // Release application object.
          m_app.ReleaseDispatch();
    					
  5. Inicie o ClassWizard MFC (CTRL+W) e adicione uma nova classe derivada da CCmdTarget e com suporte a automação (verificar "Automação" opção). Nome desta classe MyEventSink; ele será nossa implementação de eventos de aplicativo do Microsoft Word.
  6. No ClassWizard MFC, clique na guia de automação e adicione esses três métodos na ordem:
          void Startup()
          void Quit()
          void DocumentChange()
    					
  7. Em MyEventSink.cpp, implementar esses novos métodos para exibir caixas de mensagem quando eles são chamados para informá-lo quando eles são disparados:
          void MyEventSink::Startup()
          {
             AfxMessageBox("MyEventSink::Startup() called.");
          }
    
    
          void MyEventSink::Quit()
          {
             AfxMessageBox("MyEventSink::Quit() called.");
          }
    
          void MyEventSink::DocumentChange()
          {
             AfxMessageBox("MyEventSink::DocumentChange() called.");
          }
    					
  8. Abra o arquivo MyEventSink.cpp e localize a declaração IID_IMyEventSink. O ClassWizard gerado um novo GUID aleatório para sua interface, mas porque você está implementando uma interface específica que já tem um GUID, você precisará alterar seu para corresponder à. Modifique a declaração para IID_IMyEventSink da seguinte maneira: estático IID_IMyEventSink GUID const = {0x000209f7 0x000, 0 x 0000, {0xc0, 0 x 00, 0 x 0, 0 x 00, 0 x 00, 0 x 00, 0 x 00, 0x46}};
  9. Adicionar as seguintes variáveis membro públicas à sua classe WordEventsDlg em WordEventsDlg.h:
          COleDispatchDriver m_app;
          IConnectionPoint *m_pConnectionPoint;
          DWORD m_adviseCookie;
          MyEventSink m_myEventSink;
    					
  10. Adicione a seguinte linha ao WordEventsDlg.h imediatamente antes da classe CWordEventsDlg declaração:
          #include "MyEventSink.h"
    					
  11. Abra o arquivo MyEventSink.h e localize a declaração do destruidor; ele será exibido da seguinte maneira:
          // Implementation
          protected:
          virtual ~MyEventSink();
    					
  12. Mover a declaração acima a palavra "Protegido" para que as linhas de código aparecem da seguinte maneira:
          virtual ~MyEventSink();
          // Implementation
          protected:
          // virtual ~MyEventSink(); // Or this line may be removed.
    					
  13. Finalmente, verifique se que as bibliotecas OLE/COM obter a oportunidade de inicializar. Adicione o direito de código seguinte antes do manipulador do botão "Iniciar e a instalação". Isso cria uma classe global que é criada na inicialização do aplicativo e destruída ao sair. O construtor e destruidor dessa classe fornecem uma maneira útil executar limpeza e de inicialização:
          // Ole-initialization class.
          class OleInitClass {
          public:
             OleInitClass() {
                OleInitialize(NULL);
             }
             ~OleInitClass() {
                OleUninitialize();
             }
          };
          // This global class calls OleInitialize() at
          // application startup, and calls OleUninitialize()
          // at application exit.
          OleInitClass g_OleInitClass;
    					
  14. Compilar e executar.
Depois de executar o aplicativo, clique no botão " Iniciar e a instalação " para iniciar o Microsoft Word e configurar notificações de eventos. No Microsoft Word, no menu arquivo , clique em novo para criar um novo documento. Seu evento DocumentChange() deve obter acionado. Abra outro documento e observe que ele também é acionado quando alternar ativação de um documento para outro. Você pode clicar no botão " Sair e limpar backup " para parar as notificações de evento e feche o Microsoft Word, ou você pode sair do Microsoft Word (no menu arquivo , clique em Sair ) e observe a notificação de sair.

Você pode notar que o evento Startup nunca será acionado. Isso ocorre porque ele acionado antes de configurar os eventos. Observe que há realmente há motivo para tratar este evento, porque o aplicativo deve ter sido iniciado antes de chamar e definir propriedades e métodos de automação.

Microsoft Excel suporta vários eventos interessantes e úteis e você pode seguir as etapas aqui para capturá-los. No entanto, há alguns pontos a lembrar:
  • Use o Visualizador objeto OLE/COM que acompanha o Microsoft Visual C++ 5.0 para exibir a biblioteca de tipos do servidor que você está interessado. Para localizar os eventos, abra as declarações coclass (geralmente na parte inferior da árvore); os eventos associados para cada coclass serão listados. Quando você clica em uma interface de evento que você pode ver os eventos que estão disponíveis, os DISPIDs e como elas são declaradas no modo de exibição à direita.
  • Não foi necessária para modificar os DISPIDs para nossos métodos em nossa classe MyEventSink porque do Microsoft Word aplicativo eventos, Startup(), Quit() e DocumentChange() tem DISPIDs 1, 2 e 3, respectivamente. Se você criar esses métodos na ordem, você não precisa modificá-los para coincidir com a biblioteca de tipos porque ClassWizard inicia em 1 DISPID. No entanto, a maioria dos eventos, como eventos de pasta de trabalho do Microsoft Excel, não são iniciados com DISPID 1. Em tais casos, você deve modificar explicitamente o mapa de expedição MyEventSink.cpp para coincidir com os DISPIDs com os métodos corretos.

Referências

Para obter mais informações sobre como criar coletor de interfaces e simplificar o processo de conexão, clique no número abaixo para lê-lo na Base de dados de Conhecimento da Microsoft:
181845  (http://support.microsoft.com/kb/181845/ ) COMO: Criar uma interface de coletor no cliente de COM base em MFC
Para um exemplo de geral e obter mais informações sobre, pontos de conexão, consulte o exemplo Connpts.exe descrito no seguinte artigo na Base de dados de Conhecimento da Microsoft:
152087  (http://support.microsoft.com/kb/152087/ ) Pontos de conexão Implements Connpts.exe em aplicativos do MFC

A informação contida neste artigo aplica-se a:
  • 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 Word 2002 Standard Edition
  • Microsoft Word 2000 Standard Edition
  • Microsoft Word 97 Standard Edition
Palavras-chave: 
kbmt kbprogramming kbautomation kbcode kbfaq kbhowto kbinterop KB183599 KbMtpt
Tradução automáticaTraduçã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: 183599  (http://support.microsoft.com/kb/183599/en-us/ )