ID Artikel: 183599 - Kajian Terakhir: 16 September 2011 - Revisi: 2.0

Bagaimana untuk menangkap kata peristiwa aplikasi dengan menggunakan Visual C++

Tips SistemThis article applies to a different operating system than the one you are using. Article content that may not be relevant to you is disabled.
Perbesar semua | Perkecil semua

RINGKASAN

Artikel ini menunjukkan bagaimana untuk menangkap Microsoft Word 97 peristiwa aplikasi yang menggunakan Microsoft Visual C++. Namun, konsep dan kode dalam artikel ini tidak spesifik untuk Microsoft Word; mereka dikenakan untuk seluruh paket Microsoft Office aplikasi, serta yang lain aplikasi yang mengekspos peristiwa.

INFORMASI LEBIH LANJUT

Langkah-langkah berikut menggambarkan cara membuat MFC aplikasi yang menangkap peristiwa Microsoft Word 97 aplikasi Startup(), DocumentChange(), dan Quit():
  1. Membuat baru dialog kotak berbasis aplikasi menggunakan MFC AppWizard. Nama proyek Anda WordEvents, dan menerima pengaturan default.
  2. Menambahkan dua tombol ke kotak dialog dan nama tombol "Mulai dan Setup" dan "Berhenti dan Clean Up," masing-masing.
  3. Tambahkan kode berikut ke handler untuk "mulai dan Setup"tombol:
          // 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. Tambahkan kode berikut ke handler untuk "berhenti dan bersih "Up tombol:
          // 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. Mulai ClassWizard MFC (CTRL + W), dan menambahkan class baru berasal dari CCmdTarget dan dengan dukungan otomatisasi (periksa "Otomatisasi" pilihan). Nama kelas ini MyEventSink; akan kami pelaksanaan Microsoft Word aplikasi peristiwa.
  6. Dalam MFC ClassWizard, klik tab otomatisasi dan menambahkan metode ini tiga dalam rangka:
          void Startup()
          void Quit()
          void DocumentChange()
    					
  7. Dalam MyEventSink.cpp, menerapkan metode baru ini untuk menampilkan kotak pesan ketika mereka dipanggil untuk memberitahu Anda ketika mereka dipicu:
          void MyEventSink::Startup()
          {
             AfxMessageBox("MyEventSink::Startup() called.");
          }
    
    
          void MyEventSink::Quit()
          {
             AfxMessageBox("MyEventSink::Quit() called.");
          }
    
          void MyEventSink::DocumentChange()
          {
             AfxMessageBox("MyEventSink::DocumentChange() called.");
          }
    					
  8. Buka MyEventSink.cpp file dan menemukan Deklarasi IID_IMyEventSink. ClassWizard dihasilkan GUID acak baru untuk Anda antarmuka, tetapi karena Anda menerapkan tertentu antarmuka yang sudah telah GUID, Anda perlu mengubah Anda untuk mencocokkan. Memodifikasi Deklarasi IID_IMyEventSink sebagai berikut: statis const GUID IID_IMyEventSink = {0x000209f7, 0x000, 0x0000, {0xc0, 0x00, 0x0, 0x00, 0x00 0x00, 0x00, 0x46}};
  9. Menambahkan variabel anggota publik berikut untuk Anda WordEventsDlg kelas di WordEventsDlg.h:
          COleDispatchDriver m_app;
          IConnectionPoint *m_pConnectionPoint;
          DWORD m_adviseCookie;
          MyEventSink m_myEventSink;
    					
  10. Tambahkan baris berikut ke WordEventsDlg.h tepat sebelum kelas CWordEventsDlg pernyataan:
          #include "MyEventSink.h"
    					
  11. Buka file MyEventSink.h dan menemukan Deklarasi Destructor; akan muncul sebagai berikut:
          // Implementation
          protected:
          virtual ~MyEventSink();
    					
  12. Bergerak bahwa Deklarasi di atas kata "Protected" sehingga baris kode muncul sebagai berikut:
          virtual ~MyEventSink();
          // Implementation
          protected:
          // virtual ~MyEventSink(); // Or this line may be removed.
    					
  13. Akhirnya, pastikan perpustakaan OLE/COM mendapatkan kesempatan untuk menginisialisasi. Tambahkan tepat kode berikut sebelum Anda tombol "Mulai dan Setup" Handler. Ini menciptakan kelas global yang akan dibuat pada aplikasi saat startup, dan hancur di keluar. Konstruktor dan destructor kelas ini menyediakan cara mudah untuk melakukan inisialisasi dan pembersihan:
          // 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. Mengkompilasi dan menjalankan.
Setelah menjalankan aplikasi, klik "Awal dan Setup"tombol untuk memulai Microsoft Word dan mengatur acara pemberitahuan. Di Microsoft Word, pada Berkas menu, klik Baru untuk membuat dokumen baru. Acara DocumentChange() Anda harus mendapatkan dipecat. Buka dokumen lain, dan melihat bahwa itu juga dipecat ketika Anda beralih aktivasi dari dokumen satu sama lain. Anda dapat klik "Berhenti dan membersihkan"tombol untuk menghentikan acara pemberitahuan dan keluar dari Microsoft Word, atau Anda dapat keluar dari Microsoft Word (pada Berkas menu, klik Keluar) dan melihat pemberitahuan keluar.

Anda mungkin melihat bahwa acara Startup pernah dipicu. Hal ini karena itu dipecat sebelum Anda mengatur peristiwa. Perhatikan bahwa benar-benar tidak ada alasan untuk menangani acara ini, karena aplikasi ini harus dimulai sebelum Anda bisa menelepon dan mengatur Otomatisasi metode dan properti.

Microsoft Excel mendukung banyak peristiwa-peristiwa yang menarik dan bermanfaat, dan Anda dapat mengikuti langkah-langkah berikut untuk menangkap mereka. Namun, ada beberapa poin untuk diingat:
  • Menggunakan objek OLE/COM penampil yang datang dengan Microsoft Visual C++ 5.0 untuk melihat perpustakaan jenis server Anda tertarik. Pada menemukan peristiwa, membuka Deklarasi coclass (biasanya di bagian bawah pohon); peristiwa terkait untuk setiap coclass akan tercantum. Ketika Anda mengklik acara antarmuka Anda dapat melihat apa peristiwa tersedia, mereka DISPIDs, dan bagaimana mereka dinyatakan dalam pandangan di sebelah kanan.
  • Itu tidak perlu untuk mengubah DISPIDs metode kami di MyEventSink kami kelas karena Microsoft Word aplikasi peristiwa, Startup(), Quit(), dan DocumentChange() memiliki DISPIDs 1, 2 dan 3, masing-masing. Jika Anda membuat metode ini agar, Anda tidak perlu mengubahnya sesuai Perpustakaan jenis karena ClassWizard dimulai pada DISPID 1. Namun, kebanyakan peristiwa, seperti Microsoft Excel Workbook peristiwa, tidak mulai dengan DISPID 1. Sedemikian kasus, Anda harus secara eksplisit mengubah peta pengiriman di MyEventSink.cpp untuk mencocokkan DISPIDs dengan metode yang benar.

REFERENSI

Untuk informasi lebih lanjut tentang menciptakan wastafel antarmuka, dan menyederhanakan proses sambungan, klik nomor artikel di bawah ini untuk melihat itu di dalam Basis Pengetahuan Microsoft:
181845  (http://support.microsoft.com/kb/181845/ ) HOWTO: Membuat antarmuka tenggelam di klien COM berbasis MFC
Untuk contoh umum, dan informasi lebih lanjut tentang sambungan poin, lihat contoh Connpts.exe yang dijelaskan dalam artikel berikut di Basis Pengetahuan Microsoft:
152087  (http://support.microsoft.com/kb/152087/ ) Connpts.exe alat-alat sambungan poin dalam MFC Apps
Note This is a "FAST PUBLISH" article created directly from within the Microsoft support organization. The information contained herein is provided as-is in response to emerging issues. As a result of the speed in making it available, the materials may include typographical errors and may be revised at any time without notice. See Terms of Use (http://go.microsoft.com/fwlink/?LinkId=151500) for other considerations.

Berlaku bagi:
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Word 2002
  • Microsoft Word 2000
  • Microsoft Word 97 Standard Edition
Kata kunci: 
kbprogramming kbautomation kbcode kbFAQ kbhowto kbinterop kbmt KB183599 KbMtid
Penerjemahan MesinPenerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:183599  (http://support.microsoft.com/kb/183599/en-us/ )