共用方式為


coclass

建立 COM 物件,這個物件可以實作 COM 介面。

語法

[coclass]

備註

coclass C++ 屬性會將 coclass 建構放在產生的 .idl 檔案中。

定義 coclass 時,您也可以指定 uuid 、版本 執行緒 vi_progid progid 屬性。 如果未指定其中任何一個,則會產生它。

如果兩個標頭檔包含具有 coclass 屬性且未指定 GUID 的類別,則編譯器會針對這兩個類別使用相同的 GUID,這會導致 MIDL 錯誤。 因此,當您使用 coclass 時,應該使用 uuid 屬性。

ATL 專案

當此屬性在 ATL 專案中的類別或結構定義之前時,它會:

  • 插入程式碼或資料以支持對象的自動註冊。

  • 插入程式碼或資料以支援 物件的 COM 類別處理站。

  • 插入程式碼或資料以實 IUnknown 作物件,並將物件設為 COM 可建立的物件。

具體來說,下列基類會新增至目標物件:

最後,未使用內嵌 IDL 定義的任何雙重介面,會取代為對應的 IDispatchImpl 類別。 如果雙重介面是在內嵌 IDL 中定義,則基底清單中的特定介面不會修改。

coclass 屬性也會透過插入的程式碼或 基 GetObjectCLSIDCComCoClass 中的靜態方法,提供下列函式:

  • UpdateRegistry 註冊目標類別的類別處理站。

  • GetObjectCLSID與註冊相關的 ,也可以用來取得目標類別的 CLSID。

  • GetObjectFriendlyName根據預設,會傳回格式為 「 < target class name >Object 」 的字串。 如果此函式已存在,則不會新增。 將此函式新增至目標類別,以傳回比自動產生的更易記名稱。

  • GetProgID與註冊相關的字串會傳回使用 progid 屬性指定的字串。

  • GetVersionIndependentProgID 具有與 GetProgID 相同的功能,但它會傳回以 vi_progid 指定的字串。

下列與 COM 對應相關的變更會針對目標類別進行:

類別之 .idl 檔案中產生的 coclass 名稱會與 類別名稱相同。 例如,和參考下列範例,若要透過 MIDL 產生的標頭檔存取用戶端中 coclass CMyClass 的類別識別碼,請使用 CLSID_CMyClass

範例

下列程式碼示範如何使用 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 {};

下列範例示範如何覆寫 coclass 屬性所插入 程式碼中出現的函式的預設實作。 如需檢視插入程式碼的詳細資訊,請參閱 /Fx 。 您用於類別的任何基類或介面都會出現在插入的程式碼中。 此外,如果在插入的程式碼中預設包含類別,而且您明確指定該類別作為 coclass 的基底,則屬性提供者會使用程式碼中指定的表單。

// 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);
   }
};

需求

屬性內容
適用於 class, struct
可重複 No
必要屬性
無效屬性

如需有關屬性內容的詳細資訊,請參閱 屬性內容

另請參閱

IDL 屬性
COM 屬性
類別屬性
Typedef、Enum、Union 和 Struct 屬性
appobject