coclass
建立 COM 對象,這個物件可以實作 COM 介面。
語法
[coclass]
備註
coclass C++ 屬性會將 coclass 建構放在產生的 .idl 檔案中。
定義 coclass 時,您也可以指定 uuid、版本、線程、vi_progid和 progid 屬性。 如果未指定其中任何一個,則會產生它。
如果兩個頭檔包含具有 coclass 屬性且未指定 GUID 的類別,則編譯程式會針對這兩個類別使用相同的 GUID,這會導致 MIDL 錯誤。 因此,當您使用 coclass 時,應該使用 uuid
屬性。
ATL 專案
當此屬性在 ATL 專案中的類別或結構定義之前時,它會:
插入程式代碼或數據以支援物件的自動註冊。
插入程式代碼或資料以支援 物件的 COM 類別處理站。
插入程式代碼或數據以實
IUnknown
作物件,並將物件設為 COM 可建立的物件。
具體來說,下列基類會新增至目標物件:
CComCoClass 類別 提供對象的預設類別處理站和匯總模型。
CComObjectRootEx 類別具有以線程屬性所指定的線程模型類別為基礎的範本。
threading
如果未指定 屬性,默認線程模型會是Apartment。如果未為目標物件指定不可建立的屬性,則會新增 IProvideClassInfo2Impl。
最後,未使用內嵌IDL定義的任何雙重介面,會取代為對應的 IDispatchImpl 類別。 如果雙重介面是在內嵌IDL中定義,則基底清單中的特定介面不會修改。
coclass 屬性也會透過插入的程式代碼或 基GetObjectCLSID
類CComCoClass
中的靜態方法,提供下列函式:
UpdateRegistry
註冊目標類別的類別處理站。GetObjectCLSID
與註冊相關的 ,也可以用來取得目標類別的CLSID。GetObjectFriendlyName
根據預設,會傳回格式為 「<target class nameObject
>」 的字串。 如果此函式已存在,則不會新增。 將此函式新增至目標類別,以傳回比自動產生的更友好名稱。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 |
必要屬性 | 無 |
無效屬性 | 無 |
如需有關屬性內容的詳細資訊,請參閱 屬性內容。