Bagikan melalui


coclass

Membuat objek COM, yang dapat mengimplementasikan antarmuka COM.

Sintaks

[coclass]

Keterangan

Atribut coclass C++ menempatkan konstruksi coclass dalam file .idl yang dihasilkan.

Saat menentukan coclass, Anda juga dapat menentukan atribut uuid, version, threading, vi_progid, dan progid . Jika salah satu dari mereka tidak ditentukan, itu akan dihasilkan.

Jika dua file header berisi kelas dengan atribut coclass dan tidak menentukan GUID, pengkompilasi akan menggunakan GUID yang sama untuk kedua kelas, dan itu akan mengakibatkan kesalahan MIDL. Oleh karena itu, Anda harus menggunakan uuid atribut saat menggunakan coclass.

Proyek ATL

Ketika atribut ini mendahului definisi kelas atau struktur dalam proyek ATL, atribut ini:

  • Menyuntikkan kode atau data untuk mendukung pendaftaran otomatis untuk objek.

  • Menyuntikkan kode atau data untuk mendukung pabrik kelas COM untuk objek tersebut.

  • Menyuntikkan kode atau data untuk mengimplementasikan IUnknown dan menjadikan objek sebagai objek yang dapat direkreasi COM.

Secara khusus, kelas dasar berikut ditambahkan ke objek target:

  • Kelas CComCoClass menyediakan pabrik kelas default dan model agregasi untuk objek.

  • Kelas CComObjectRootEx memiliki templat berdasarkan kelas model utas yang ditentukan oleh atribut threading . threading Jika atribut tidak ditentukan, model utas default adalah apartemen.

  • IProvideClassInfo2Impl ditambahkan jika atribut noncreatable tidak ditentukan untuk objek target.

Terakhir, antarmuka ganda apa pun yang tidak ditentukan menggunakan IDL tersemat diganti dengan kelas IDispatchImpl yang sesuai. Jika antarmuka ganda didefinisikan dalam IDL yang disematkan, antarmuka tertentu dalam daftar dasar tidak dimodifikasi.

Atribut coclass juga membuat fungsi berikut tersedia melalui kode yang disuntikkan, atau dalam kasus GetObjectCLSID, sebagai metode statis di kelas CComCoClassdasar :

  • UpdateRegistry mendaftarkan pabrik kelas kelas target.

  • GetObjectCLSID, yang terkait dengan pendaftaran, juga dapat digunakan untuk mendapatkan CLSID dari kelas target.

  • GetObjectFriendlyName secara default mengembalikan string format "<nama>Object kelas target". Jika fungsi ini sudah ada, fungsi ini tidak ditambahkan. Tambahkan fungsi ini ke kelas target untuk mengembalikan nama yang lebih ramah daripada yang dihasilkan secara otomatis.

  • GetProgID, yang terkait dengan pendaftaran, mengembalikan string yang ditentukan dengan atribut progid .

  • GetVersionIndependentProgID memiliki fungsionalitas yang sama dengan GetProgID, tetapi menampilkan string yang ditentukan dengan vi_progid.

Perubahan berikut, yang terkait dengan peta COM, dibuat ke kelas target:

Nama coclass yang dihasilkan dalam file .idl untuk kelas akan memiliki nama yang sama dengan kelas . Misalnya, dan mengacu pada sampel berikut, untuk mengakses ID kelas untuk kolase CMyClass, di klien melalui file header yang dihasilkan MIDL, gunakan CLSID_CMyClass.

Contoh

Kode berikut menunjukkan cara menggunakan atribut coclass :

// cpp_attr_ref_coclass1.cpp
// compile with: /LD
#include "unknwn.h"
[module(name="MyLib")];

[ object, uuid("00000000-0000-0000-0000-000000000001") ]
__interface I {
   HRESULT func();
};

[coclass, progid("MyCoClass.coclass.1"), vi_progid("MyCoClass.coclass"),
appobject, uuid("9E66A294-4365-11D2-A997-00C04FA37DDB")]
class CMyClass : public I {};

Sampel berikut menunjukkan cara mengambil alih implementasi default fungsi yang muncul dalam kode yang disuntikkan oleh atribut coclass . Lihat /Fx untuk informasi selengkapnya tentang melihat kode yang disuntikkan. Setiap kelas dasar atau antarmuka yang Anda gunakan untuk kelas akan muncul dalam kode yang disuntikkan. Selanjutnya, jika kelas disertakan secara default dalam kode yang disuntikkan dan Anda secara eksplisit menentukan kelas tersebut sebagai dasar untuk kolase Anda, penyedia atribut akan menggunakan formulir yang ditentukan dalam kode Anda.

// cpp_attr_ref_coclass2.cpp
// compile with: /LD
#include <atlbase.h>
#include <atlcom.h>
#include <atlwin.h>
#include <atltypes.h>
#include <atlctl.h>
#include <atlhost.h>
#include <atlplus.h>

[module(name="MyLib")];

[object, uuid("00000000-0000-0000-0000-000000000000")]
__interface bb {};

[coclass, uuid("00000000-0000-0000-0000-000000000001")]
class CMyClass : public bb {
public:
   // by adding the definition of UpdateRegistry to your code, // the function will not be included in the injected code
   static HRESULT WINAPI UpdateRegistry(BOOL bRegister) {
      // you can add to the default implementation
      CRegistryVirtualMachine rvm;
      HRESULT hr;
      if (FAILED(hr = rvm.AddStandardReplacements()))
         return hr;
      rvm.AddReplacement(_T("FriendlyName"), GetObjectFriendlyName());
      return rvm.VMUpdateRegistry(GetOpCodes(), GetOpcodeStringVals(),       GetOpcodeDWORDVals(), GetOpcodeBinaryVals(), bRegister);
   }
};

Persyaratan

Konteks atribut Nilai
Berlaku untuk class, struct
Berulang Tidak
Atribut yang diperlukan Tidak ada
Atribut tidak valid Tidak ada

Untuk informasi selengkapnya tentang konteks atribut, lihat Konteks Atribut.

Baca juga

Atribut IDL
Atribut COM
Atribut Kelas
Atribut Typedef, Enum, Union, dan Struct
appobject