ID Artikel: 194179 - Kajian Terakhir: 19 September 2011 - Revisi: 2.0

AtlEvnt.exe sampel menunjukkan bagaimana untuk menciptakan ATL tenggelam dengan menggunakan kelas ATL IDispEventImpl dan IDispEventSimpleImpl

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.
Microsoft Visual C++.NET (2002) dan Microsoft Visual C++.NET (2003) mendukung kedua kode dikelola model yang disediakan oleh.NET Kerangka kerja dan tidak dikelola model kode Windows asli. Informasi ini Artikel ini berlaku untuk kode Visual C++ unmanaged hanya.

Pada Halaman ini

Perbesar semua | Perkecil semua

RINGKASAN

AtlEvnt.exe menunjukkan kepada Anda bagaimana menerapkan acara wastafel menggunakan kelas ATL IDispEventImpl dan IDispEventSimpleImpl. Untuk kontrol komposit atau ATL dialog, Wisaya menyisipkan IDispEventImpl dalam daftar warisan untuk mengatur wastafel. Jadi fokus sampel ini adalah untuk menciptakan tenggelam untuk jenis lainnya objek COM dan klien. Hal ini hanya berlaku untuk sumber antarmuka dari jenis dispinterface.

Menggunakan IDispEventImpl ketika Anda memiliki akses ke Perpustakaan jenis. Menggunakan IDispEventSimpleImpl ketika Anda tidak memiliki akses ke tipe perpustakaan atau ketika Anda ingin menjadi lebih efisien dengan tidak memuat perpustakaan jenis.

Selain untuk link ke sampel, bagian lebih informasi Artikel ini mencakup ringkasan proyek dan informasi tentang cara untuk menerapkan setiap kelas.

INFORMASI LEBIH LANJUT

The berkas berikut ini tersedia untuk di-download dari Microsoft Download Pusat:

Visual C++ 6.0

Perkecil gambar iniPerbesar gambar ini
Unduh
Download Atlevnt.exe sekarang (http://download.microsoft.com/download/vc60pro/sample7/1/WIN98/EN-US/AtlEvnt.exe)
Untuk informasi lebih tentang cara men-download berkas Dukungan Microsoft, klik nomor artikel dibawah ini untuk melihat artikel pada Basis Pengetahuan Microsoft:
119591  (http://support.microsoft.com/kb/119591/ ) Cara mendapatkan berkas dukungan Microsoft dari layanan daring
Microsoft telah memindai berkas ini dari virus. Microsoft menggunakan perangkat lunak pendeteksi virus terbaru yang tersedia pada tanggal saat berkas dikirimkan. Berkas tersebut disimpan di server aman, yang membantu mencegah segala perubahan tidak sah terhadap berkas.

Visual C++.NET

Perkecil gambar iniPerbesar gambar ini
Unduh
Download Atlevntvcnet.exe sekarang (http://download.microsoft.com/download/visualstudionet/sample/1.11/win98mexp/en-us/Atlevntvcnet.exe)
Tanggal rilis: 25 Juni 2002

Untuk informasi lebih tentang cara men-download berkas Dukungan Microsoft, klik nomor artikel dibawah ini untuk melihat artikel pada Basis Pengetahuan Microsoft:
119591  (http://support.microsoft.com/kb/119591/ ) Cara mendapatkan berkas dukungan Microsoft dari layanan daring
Microsoft telah memindai berkas ini dari virus. Microsoft menggunakan perangkat lunak pendeteksi virus terbaru yang tersedia pada tanggal saat berkas dikirimkan. Berkas tersebut disimpan di server aman, yang membantu mencegah segala perubahan tidak sah terhadap berkas. ATLEVNT kerja terdiri dari dua proyek, AtlEvnt dan EventSrc. Menggunakan opsi -d ketika Anda menjalankan AtlEvnt.exe:
AtlEvnt.exe -d

Gambaran proyek

AtlEvnt Workspace terdiri dari dua proyek, AtlEvnt dan EventSrc.

Proyek EventSrc adalah default ATL DLL proyek dengan salah satu "Objek sederhana." Objek sederhana telah tidak ada metode dan telah dimodifikasi untuk dukungan koneksi poin dan IPersist antarmuka. Objek COM memperlihatkan sumber standar antarmuka (di bawah) yang memiliki satu metode yang disebut kutu. COM panggilan objek metode ini pada semua objek wastafel terhubung ke itu, berdasarkan timer:
   dispinterface _EventSink
   {

      properties:
      methods:
      [id(1), helpstring("method Tick")] HRESULT Tick([in] long tckcnt);

   }

				
Proyek AltEvnt adalah sebuah proyek ATL EXE. ATL CDialogImpl kelas ditambahkan untuk mengubah proyek ke aplikasi sederhana dialog. Empat tenggelam yang ditambahkan ke proyek (dua menggunakan IDispEventImpl dan menggunakan dua IDispEventSimpleImpl). Setiap wastafel menggambarkan cara yang berbeda untuk menyediakan wastafel objek untuk menangani Tick acara ditembakkan oleh objek EventSrc COM.

Kotak dialog memiliki empat tombol dan mengklik tombol memungkinkan menghubungkan wastafel sesuai ke objek EventSrc COM. Kotak daftar menampilkan serangkaian bentuk "Sinkn: Tick acara diterima - x" setiap kali kutu event handler di wastafel disebut. Setelah sambungan dibuat, tombol dinonaktifkan. Jika ada masalah membangun sambungan, kemudian tombol teks digantikan dengan serangkaian bentuk "Connect Err-hr" di mana "jam" mewakili kegagalan HRESULT. Menggunakan alat "Kesalahan LookUp" yang kapal dengan Visual C++, versi 6.0 untuk mendapatkan penjelasan dari kesalahan.

Untuk menjalankan ini sampel, pertama membangun proyek EventSrc dan memastikan objek EventSrc berhasil terdaftar. Kemudian membangun proyek AtlEvnt dan menjalankannya. Sebuah dialog kotak dengan empat tombol (terlepas dari OK dan membatalkan) dan sebuah kotak daftar akan ditampilkan. Empat tombol mewakili empat tenggelam. Mengklik tombol menghubungkan tenggelam ke sumber. Setelah sambungan dibuat, string yang ditambahkan ke daftar kotak setiap waktu handler disebut.

Langkah-langkah untuk mengimplementasikan IDispEventImpl

  1. Menciptakan kelas baru yang berasal dari IDispEventImpl. Kamu bisa Klik Kelas baru pada Masukkan menu untuk menghasilkan kelas baru. Untuk masing-masing berbeda wastafel, menambahkan IDispEventImpl kelas ke daftar warisan dengan ID yang unik sebagai yang pertama parameter. Wastafel kelas dapat menjadi objek COM (seperti dalam komposit kontrol) atau kelas yang hanya berasal dari IdispEventImpl:
    // Just a sink.
          class CSinkObj : public IDispEventImpl<IDC_OBJ, CSinkObj>
          {
             ...
          }
    -atau-
    // COM object that also implements a sink (as in a composite
          // control).
          class ATL_NO_VTABLE CSinkObj :
             public CComObjectRootEx<CComSingleThreadModel>,
             public CComCoClass<CSinkObj, &CLSID_SinkObj>,
             public IDispatchImpl<ISinkObj, &IID_ISinkObj, &LIBID_SINKPROJLib>,
             public IDispEventImpl<IDC_SRCOBJ, CSinkObj>
          {
             ...
          }
  2. Anda juga dapat menentukan sumber antarmuka ID, jenis Perpustakaan ID, besar dan kecil versi jumlah perpustakaan jenis yang berisi sumber antarmuka secara eksplisit sebagai parameter IdispEventImpl, atau menggunakan AtlGetObjectSourceInterface() untuk mengekstrak informasi ini dari jenis perpustakaan. Penggunaan AtlGetObjectSourceInterface() mensyaratkan bahwa objek COM penembakan acara menerapkan baik IProvideClassInfo2 atau IPersist *:
    class CSinkObj : public IDispEventImpl<IDC_OBJ, CSinkObj>
          {
             ...
          }
    -atau-
    class CSinkObj : public IDispEventImpl<IDC_OBJ, CSinkObj,
             &DIID__EventSink, // Source interface GUID.
             &LIBID_COMOBJLib, // typelib ID containing source interface.
             1,                // Major version # of LIBID_COMOBJLib.
             0>                // Minor version # of LIBID_COMOBJLib.
          {
             ...
          }
  3. Menambahkan peta wastafel untuk kelas atas dan tenggelam masuk sesuai dengan setiap peristiwa antarmuka sumber yang Anda ingin menangani. Menggunakan SINK_ENTRY_EX() ketika antarmuka sumber ditentukan sebagai parameter dalam IDispEventImpl, sebaliknya, menggunakan SINK_ENTRY():
    class CSinkObj : public IDispEventImpl<IDC_SRCOBJ, CSinkObj>
          {
          public:
             BEGIN_SINK_MAP(CSinkObj)
                SINK_ENTRY(IDC_SRCOBJ, 1 /*DISPID*/, OnTick /*Event Handler*/)
             END_SINK_MAP()
             ...
          }
    -atau-
    class CSinkObj : public IDispEventImpl<IDC_OBJ, CSinkObj,
                                  &DIID__EventSink, &LIBID_COMOBJLib, 1, 0>
          {
          public:
             BEGIN_SINK_MAP(CSinkObj)
                SINK_ENTRY_EX(IDC_SRCOBJ, DIID__EventSink, 1, OnTick)
             END_SINK_MAP()
             ...
          }
  4. Tambahkan event handler metode untuk kelas Anda. Pastikan mereka memiliki __stdcall memanggil Konvensi:
    class CSinkObj : public IDispEventImpl<IDC_SRCOBJ, CSinkObj3>
          {
          public:
             BEGIN_SINK_MAP(CSinkObj)
                SINK_ENTRY(IDC_SRCOBJ, 1 , OnTick)
             END_SINK_MAP()
    
    
             // event handler for event defined in idl as
             // [id(1)] HRESULT Tick([in] long tckcnt);
             HRESULT __stdcall OnTick(long tickcnt)
             {
                ATLTRACE("CSinkObj::OnTick\n");
                return S_OK;
             }
             ...
          }
  5. Menghubungkan tenggelam ke objek COM dengan menelepon DispEventAdvise(). Jika antarmuka sumber ditentukan sebagai parameter untuk IDispEventImpl kemudian panggilan:
    // pUnk is the IUnknown pointer of the COM object that fires events.
       // pSinkObj is an instance of the CSinkObj class.
          pSinkObj->DispEventAdvise(pUnk);
    atau hubungi:
    // Make sure the COM object corresponding to pUnk implements
          // IProvideClassInfo2 or IPersist*.
          // Call this method to extract info about source type library if you
          // specified only two parameters to IdispEventImpl.
          AtlGetObjectSourceInterface(pUnk, &pSinkObj->m_libid,
             &pSinkObj->m_iid, &pSinkObj->m_wMajorVerNum,
             &pSinkObj->m_wMinorVerNum);
    
          hr = pSinkObj->DispEventAdvise(pUnk, &pSinkObj->m_iid);
  6. Memutus wastafel dengan menelepon DispEventUnadvise():
    pSinkObj->DispEventUnadvise(pUnk);

Langkah-langkah untuk mengimplementasikan IDispEventSimpleImpl

  1. Membuat kelas yang diturunkan dari IDispEventSimpleImpl. The sumber antarmuka harus ditentukan.
  2. Ikuti langkah 3 di atas kecuali menambahkan SINK_ENTRY_INFO() untuk masing-masing metode antarmuka sumber yang akan menangani. Sejak IDispEventSimpleImpl tidak memiliki akses ke perpustakaan jenis yang Anda harus menyediakan informasi tentang setiap event handler melalui _ATL_FUNC_INFO struktur, satu untuk setiap event handler.

    Alih-alih menentukan Struktur _ATL_FUNC_INFO di SINK_ENTRY_INFO(), Anda dapat menggunakan SINK_ENTRY_EX() makro dan menimpa fungsi virtual GetFuncInfoFromId() untuk mengisi _ATL_FUNC_INFO struktur, seperti yang ditunjukkan dalam kode berikut.
  3. Ikuti langkah-langkah 4 sampai 6 dari atas:
    static _ATL_FUNC_INFO OnTickInfo = {
             CC_STDCALL,   // Calling convention.
             VT_I4,        // Return type.
             1,            // Number of arguments.
             {VT_I4}       // Argument types.
          };
    
          class CSinkObj :
             public IDispEventSimpleImpl<IDC_SRCOBJ, CSinkObj,
                    &DIID__EventSink>
          {
          public:
          BEGIN_SINK_MAP(CSinkObj)
             SINK_ENTRY_INFO(IDC_SRCOBJ, DIID__EventSink, 1, OnTick,
                             &OnTickInfo)
          END_SINK_MAP()
    
             HRESULT __stdcall OnTick(long tickcnt)
             {
                ATLTRACE("CSinkObj::OnTick\n");
                return S_OK;
             }
             ...
    
          }
    -atau-
    class CSinkObj :
             public IDispEventSimpleImpl<IDC_SRCOBJ, CSinkObj,
                    &DIID__EventSink>
          {
          public:
          BEGIN_SINK_MAP(CSinkObj4)
             SINK_ENTRY_EX(IDC_SRCOBJ, DIID__EventSink, 1, OnTick)
             // Equivalent to:
             // SINK_ENTRY_INFO(IDC_SRCOBJ, DIID__EventSink, 1, OnTick, NULL)
          END_SINK_MAP()
    
             HRESULT GetFuncInfoFromId(const IID& iid, DISPID dispidMember,
                LCID lcid, _ATL_FUNC_INFO& info)
             {
                if (InlineIsEqualGUID(iid, DIID__EventSink))
                {
                   info.cc = CC_STDCALL;
                   switch(dispidMember)
                   {
                      case 1:
                         info.vtReturn = VT_I4;
                         info.nParams = 1;
                         info.pVarTypes[0] =  VT_I4;
                         return S_OK;
    
                      default:
                         return E_FAIL;
                   }
                }
                return E_FAIL;
             }
    
             HRESULT __stdcall OnTick(long tickcnt)
             {
                ATLTRACE("CSinkObj::OnTick\n");
                return S_OK;
             }
             ...
          }

REFERENSI

Untuk informasi selengkapnya, klik nomor artikel berikut untuk melihat artikel di Pangkalan Pengetahuan Microsoft:
181277  (http://support.microsoft.com/kb/181277/ ) AtlSink menggunakan ATL untuk membuat wastafel dispinterface

Berlaku bagi:
  • Microsoft ActiveX Template Library 3.0, ketika digunakan dengan:
    • Microsoft Visual C++ .NET 2002 Standard Edition
    • Microsoft Visual C++ .NET 2003 Standard Edition
Kata kunci: 
kbtshoot kbdownload kbactivexevents kbconnpts kbFAQ kbfile kbhowto kbsample kbmt KB194179 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:194179  (http://support.microsoft.com/kb/194179/en-us/ )