coclass
COM arabirimi uygulayabilen bir COM nesnesi oluşturur.
Sözdizimi
[coclass]
Açıklamalar
coclass C++ özniteliği, oluşturulan .idl dosyasına bir coclass yapısı yerleştirir.
Ortak sınıf tanımlarken uuid, version, threading, vi_progid ve progid özniteliklerini de belirtebilirsiniz. Bunlardan herhangi biri belirtilmezse, oluşturulur.
İki üst bilgi dosyası coclass özniteliğine sahip sınıflar içeriyorsa ve GUID belirtmiyorsa, derleyici her iki sınıf için de aynı GUID'yi kullanır ve bu da MIDL hatasına neden olur. Bu nedenle, coclass kullanırken özniteliğini uuid
kullanmanız gerekir.
ATL Projeleri
Bu öznitelik ATL projesindeki bir sınıf veya yapı tanımının önüne geçtiğinde:
Nesnenin otomatik kaydını desteklemek için kod veya veri ekler.
Nesne için COM sınıf fabrikasını desteklemek üzere kod veya veri ekler.
Uygulamak
IUnknown
için kod veya veri ekler ve nesneyi COM-creatable nesnesi yapar.
Özellikle, aşağıdaki temel sınıflar hedef nesneye eklenir:
CComCoClass Sınıfı , nesne için varsayılan sınıf fabrikasını ve toplama modelini sağlar.
CComObjectRootEx Sınıfı, iş parçacığı oluşturma özniteliği tarafından belirtilen iş parçacığı modeli sınıfını temel alan bir şablona sahiptir.
threading
Öznitelik belirtilmezse, varsayılan iş parçacığı modeli apartment'tır.Hedef nesne için oluşturulabilir olmayan öznitelik belirtilmezse IProvideClassInfo2Impl eklenir.
Son olarak, katıştırılmış IDL kullanılarak tanımlanmayan tüm çift arabirimler, karşılık gelen IDispatchImpl sınıfıyla değiştirilir. Çift arabirim eklenmiş IDL'de tanımlanmışsa, temel listedeki belirli arabirim değiştirilmez.
coclass özniteliği, aşağıdaki işlevleri eklenen kod aracılığıyla veya durumunda GetObjectCLSID
temel sınıfta CComCoClass
statik bir yöntem olarak da kullanılabilir hale getirir:
UpdateRegistry
hedef sınıfın sınıf fabrikalarını kaydeder.GetObjectCLSID
, kayıtla ilişkilidir, hedef sınıfın CLSID'sini almak için de kullanılabilir.GetObjectFriendlyName
varsayılan olarak "<hedef sınıf adı>Object
" biçiminde bir dize döndürür. Bu işlev zaten varsa, eklenmez. Otomatik olarak oluşturulandan daha kolay bir ad döndürmek için bu işlevi hedef sınıfa ekleyin.GetProgID
, kayıtla ilişkilidir, progid özniteliğiyle belirtilen dizeyi döndürür.GetVersionIndependentProgID
ile aynı işlevselliğeGetProgID
sahiptir, ancak vi_progid ile belirtilen dizeyi döndürür.
COM eşlemesi ile ilgili aşağıdaki değişiklikler hedef sınıfta yapılır:
Hedef sınıfın türetdiği tüm arabirimler ve COM Arabirim Giriş Noktaları özniteliği tarafından belirtilen tüm girişler veya toplamalar özniteliği için gerekli olan girişlerle bir COM eşlemesi eklenir.
COM eşlemesine bir OBJECT_ENTRY_AUTO makro eklenir.
sınıfı için .idl dosyasında oluşturulan ortak sınıfın adı sınıfla aynı ada sahip olur. Örneğin, aşağıdaki örneğe başvuruda bulunarak, midl tarafından oluşturulan üst bilgi dosyası aracılığıyla istemcide bir ortak sınıfın CMyClass
sınıf kimliğine erişmek için kullanın CLSID_CMyClass
.
Örnek
Aşağıdaki kod, coclass özniteliğinin nasıl kullanılacağını gösterir:
// 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 {};
Aşağıdaki örnekte, coclass özniteliği tarafından eklenen kodda görünen bir işlevin varsayılan uygulamasının nasıl geçersiz kılındığı gösterilmektedir. Eklenen kodu görüntüleme hakkında daha fazla bilgi için bkz . /Fx . Bir sınıf için kullandığınız tüm temel sınıflar veya arabirimler eklenen kodda görünür. Ayrıca, eklenen koda varsayılan olarak bir sınıf dahil edilirse ve bu sınıfı coclass'ınız için temel olarak açıkça belirtirseniz, öznitelik sağlayıcısı kodunuzda belirtilen formu kullanır.
// 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);
}
};
Gereksinimler
Öznitelik bağlamı | Değer |
---|---|
Şunlar için geçerlidir: | class , struct |
Tekrarlanabilir | Hayır |
Gerekli öznitelikler | Hiçbiri |
Geçersiz öznitelikler | Hiçbiri |
Öznitelik bağlamları hakkında daha fazla bilgi için bkz . Öznitelik Bağlamları.
Ayrıca bkz.
IDL öznitelikleri
COM Öznitelikleri
Sınıf Öznitelikleri
Typedef, Enum, Union ve Struct Öznitelikleri
appobject