Aracılığıyla paylaş


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:

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 GetObjectCLSIDtemel sınıfta CComCoClassstatik 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.

  • GetVersionIndependentProgIDile aynı işlevselliğe GetProgIDsahiptir, 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:

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 CMyClasssı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 None
Geçersiz öznitelikler None

Ö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