A chamar eventos da aplicação do Word utilizando o Visual C++

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

Sumário

Este artigo demonstra como detectar o Microsoft Word 97 aplicação eventos utilizando Microsoft Visual C++. No entanto, os conceitos e código deste artigo não são específicos do Microsoft Word; são aplicáveis a todos os programas de aplicações do Microsoft Office, bem como outras aplicações que expõem eventos.

Mais Informação

Os passos seguintes ilustram como criar um MFC aplicação que identificou os eventos de aplicações do Microsoft Word 97 Startup() DocumentChange() e Quit():
  1. Criar uma nova diálogo baseado na caixa aplicação utilizando o MFC AppWizard. Nome do projecto WordEvents e aceitar as predefinições.
  2. Adicionar dois botões à sua caixa de diálogo e o nome botões "Iniciar e o programa de configuração" e "Sair e limpar para cima," respectivamente.
  3. Adicione o seguinte código para uma rotina de tratamento do botão "Iniciar e o programa de configuraçã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 para uma rotina de tratamento do 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. Iniciar o MFC ClassWizard (CTRL+W) e adicionar uma nova classe derivada de CCmdTarget e com suporte de automatização (verifique "Automatização" opção). Nome desta classe MyEventSink; estará a implementação de eventos de aplicações do Microsoft Word.
  6. No ClassWizard MFC, clique no separador automatização e adicione estes três métodos pela ordem:
          void Startup()
          void Quit()
          void DocumentChange()
    					
  7. Em MyEventSink.cpp, implementar estes novos métodos para apresentar caixas de mensagens quando estes são chamados para o informar quando são accionados:
          void MyEventSink::Startup()
          {
             AfxMessageBox("MyEventSink::Startup() called.");
          }
    
    
          void MyEventSink::Quit()
          {
             AfxMessageBox("MyEventSink::Quit() called.");
          }
    
          void MyEventSink::DocumentChange()
          {
             AfxMessageBox("MyEventSink::DocumentChange() called.");
          }
    					
  8. Abra o ficheiro MyEventSink.cpp e localize a declaração para IID_IMyEventSink. O ClassWizard geradas um novo GUID aleatório para a interface, mas porque está a implementar uma interface específica que já tenha um GUID, terá de alterar seu para corresponder. Modifique a declaração para IID_IMyEventSink da seguinte forma: estático IID_IMyEventSink constante do GUID = {0x000209f7, 0 x 000 0x0000, {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 de membro público à classe WordEventsDlg em WordEventsDlg.h:
          COleDispatchDriver m_app;
          IConnectionPoint *m_pConnectionPoint;
          DWORD m_adviseCookie;
          MyEventSink m_myEventSink;
    					
  10. Adicione a seguinte linha WordEventsDlg.h direita antes a classe de declaração CWordEventsDlg:
          #include "MyEventSink.h"
    					
  11. Abra o ficheiro MyEventSink.h e localize a declaração do processo de destruição; aparecerá da seguinte forma:
          // Implementation
          protected:
          virtual ~MyEventSink();
    					
  12. Mover essa declaração acima a palavra "Protegido" para que as linhas de código aparecem da seguinte forma:
          virtual ~MyEventSink();
          // Implementation
          protected:
          // virtual ~MyEventSink(); // Or this line may be removed.
    					
  13. Finalmente, certifique-se que as bibliotecas OLE/COM oportunidade de inicialização. Adicione o direito de código seguinte antes do processador de botão "Iniciar e o programa de configuração". Isto cria uma classe global que é criada no arranque da aplicação e destruída na saída. O construtor e processo de destruição desta classe fornecem uma forma útil para efectuar a inicialização e limpeza:
          // 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. Compilação e execução.
Depois de executar a aplicação, clique no botão " Iniciar e o programa de configuração " para iniciar o Microsoft Word e configurar notificações de eventos. No Microsoft Word, no menu ficheiro , clique em Novo para criar um novo documento. Deve obter desencadeou o evento DocumentChange(). Abrir outro documento e repare que que também é desencadeado quando mudar de activação de um documento para outro. Pode clicar no botão ' Sair e limpar para cima ' para parar as notificações de eventos e saia do Microsoft Word ou pode sair do Microsoft Word (no menu ficheiro , clique em ' Sair ') e repare a notificação de sair.

Poderá notar que o evento de arranque nunca é accionado. Isto acontece porque é desencadeado antes de configurar os eventos. Tenha em atenção que não existe realmente nenhuma razão para processar este evento, porque a aplicação tem foram iniciada antes de chamar e definir propriedades e métodos de automatização.

O Microsoft Excel suporta muitos eventos interessantes e úteis e siga os passos aqui para chamá-los. No entanto, existem alguns aspectos a lembrar-se:
  • Utilize o Visualizador objecto OLE/COM fornecido com o Microsoft Visual C++ 5.0 para ver a biblioteca de tipos do servidor que está interessado. Para localizar eventos, abra as declarações coclass (normalmente na parte inferior da árvore); os eventos associados para cada coclass serão listados. Quando clica numa interface de eventos pode ver os eventos que estão disponíveis os DISPID e como são declarados na vista à direita.
  • Não foi necessária para modificar DISPID para os nossos métodos na nossa classe MyEventSink porque o Microsoft Word aplicações eventos, Startup(), Quit() e DocumentChange() têm DISPID 1, 2 e 3, respectivamente. Se criar estes métodos pela ordem, não tem de modificá-los para corresponder a biblioteca de tipos porque ClassWizard começa em 1 de DISPID. No entanto, os eventos a maior parte dos, tais como eventos de livro do Microsoft Excel, não são iniciados com DISPID 1. Nesses casos, terá de modificar explicitamente o mapa de despacho MyEventSink.cpp para corresponder a DISPID com os métodos correctos.

Referências

Para mais informações sobre como criar Lavatório interfaces e simplificar o processo de ligação, clique no número de artigo existente abaixo para visualizá-lo na base de dados de conhecimento da Microsoft:
181845COMO: Criar uma interface de receptor do MFC-Based Client COM
Para um exemplo geral de e obter mais informações sobre, pontos de ligação, consulte o exemplo de Connpts.exe descrito no seguinte artigo na base de dados de conhecimento da Microsoft:
152087Pontos de ligação Connpts.exe Implements no MFC aplicações

Propriedades

Artigo: 183599 - Última revisão: 12 de fevereiro de 2007 - Revisão: 4.4
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á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: 183599

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