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 CComCoClass
dasar :
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 denganGetProgID
, tetapi menampilkan string yang ditentukan dengan vi_progid.
Perubahan berikut, yang terkait dengan peta COM, dibuat ke kelas target:
Peta COM ditambahkan dengan entri untuk semua antarmuka yang berasal dari kelas target dan semua entri yang ditentukan oleh atribut COM Interface Entry Points atau yang diperlukan oleh atribut agregat .
Makro OBJECT_ENTRY_AUTO disisipkan ke dalam peta COM.
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 | No |
Atribut yang diperlukan | Tidak |
Atribut tidak valid | Tidak |
Untuk informasi selengkapnya tentang konteks atribut, lihat Konteks Atribut.
Lihat juga
Atribut IDL
Atribut COM
Atribut Kelas
Atribut Typedef, Enum, Union, dan Struct
appobject