分享方式:


CComCoClass 類別

這個類別提供方法來建立類別的實例,並取得其屬性。

語法

template <class T, const CLSID* pclsid = &CLSID_NULL>
class CComCoClass

參數

T
您的類別衍生自 CComCoClass

pclsid
物件的 CLSID 指標。

成員

公用方法

名稱 描述
CComCoClass::CreateInstance (靜態)建立類別的實例和介面的查詢。
CComCoClass::Error (靜態)將豐富的錯誤資訊傳回給用戶端。
CComCoClass::GetObjectCLSID (靜態)傳回物件的類別識別碼。
CComCoClass::GetObjectDescription (靜態)覆寫 以傳回物件的描述。

備註

CComCoClass 提供方法來擷取物件的 CLSID、設定錯誤資訊,以及建立 類別的實例。 物件對應中註冊的任何類別都應該衍生自 CComCoClass

CComCoClass 也會定義對象的預設類別處理站和匯總模型。 CComCoClass 使用下列兩個宏:

  • DECLARE_CLASSFACTORY宣告類別處理站為 CComClassFactory

  • DECLARE_AGGREGATABLE 宣告可以匯總您的物件。

您可以在類別定義中指定另一個巨集,以覆寫其中一個預設值。 例如,若要使用 CComClassFactory2 而非 CComClassFactory,請指定 DECLARE_CLASSFACTORY2巨集

class ATL_NO_VTABLE CMyClass2 :
   public CComObjectRootEx<CComSingleThreadModel>,
   public CComCoClass<CMyClass2, &CLSID_MyClass>,
   public IDispatchImpl<IMyClass, &IID_IMyClass, &LIBID_NVC_ATL_COMLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
   public IDispatchImpl<IMyDualInterface, &__uuidof(IMyDualInterface), &LIBID_NVC_ATL_COMLib, /* wMajor = */ 1, /* wMinor = */ 0>
{
public:
   DECLARE_CLASSFACTORY2(CMyLicense)

   // Remainder of class declaration omitted

需求

標頭: atlcom.h

CComCoClass::CreateInstance

CreateInstance使用這些函式來建立 COM 物件的實例,並在不使用 COM API 的情況下擷取介面指標。

template <class  Q>
static HRESULT CreateInstance( Q** pp);

template <class  Q>
static HRESULT CreateInstance(IUnknown* punkOuter, Q** pp);

參數

Q
應該透過 pp傳回的 COM 介面。

punkOuter
[in]匯總的外部未知或控制未知。

pp
[out]如果建立成功,則接收所要求介面指標的指標變數位址。

傳回值

標準 HRESULT 值。 如需可能傳回值的描述,請參閱 Windows SDK 中的 CoCreateInstance

備註

使用此函式的第一個多載來建立一般物件;當您需要匯總所建立的物件時,請使用第二個多載。

實作必要 COM 物件的 ATL 類別(亦即,做為 CComCoClass 的第一個範本參數的類別)必須位於與呼叫程式代碼相同的專案中。 COM 物件的建立是由為這個 ATL 類別註冊的類別處理站所執行。

這些函式適用於使用 OBJECT_ENTRY_NON_CREATEABLE_EX_AUTO 巨集 建立無法外部建立的物件。 在您想要因效率考慮而避免 COM API 的情況下,它們也很有用。

請注意,介面 Q 必須有與其相關聯的 IID,才能使用 __uuidof 運算符來擷取

範例

在下列範例中, CDocument 是衍生自 CComCoClass 的精靈產生的 ATL 類別,可實作 IDocument 介面。 類別會在對象對應中向 OBJECT_ENTRY_NON_CREATEABLE_EX_AUTO 巨集 註冊,因此客戶端無法使用 CoCreateInstance 建立文件的實例。 CApplication 是 CoClass,可在其中一個自己的 COM 介面上提供方法,以建立文件類別的實例。 下列程式代碼示範如何使用 CreateInstance 繼承自 CComCoClass 基類的成員,建立文件類別的實例是多麼容易。

STDMETHODIMP CMyApp::CreateDocument( /* [out, retval] */ IDocument** ppDoc)
{
   *ppDoc = NULL;
   return CMyDoc::CreateInstance(ppDoc);
}

CComCoClass::Error

此靜態函式會設定 IErrorInfo 介面,以提供錯誤資訊給用戶端。

static HRESULT WINAPI Error(
    LPCOLESTR lpszDesc,
    const IID& iid = GUID_NULL,
    HRESULT hRes = 0);

static HRESULT WINAPI Error(
    LPCOLESTR lpszDesc,
    DWORD dwHelpID,
    LPCOLESTR lpszHelpFile,
    const IID& iid = GUID_NULL,
    HRESULT hRes = 0);

static HRESULT WINAPI Error(
    LPCSTR lpszDesc,
    const IID& iid = GUID_NULL,
    HRESULT hRes = 0);

static HRESULT WINAPI Error(
    LPCSTR lpszDesc,
    DWORD dwHelpID,
    LPCSTR lpszHelpFile,
    const IID& iid = GUID_NULL,
    HRESULT hRes = 0);

static HRESULT WINAPI Error(
    UINT nID,
    const IID& iid = GUID_NULL,
    HRESULT hRes = 0,
    HINSTANCE hInst = _AtlBaseModule.GetResourceInstance ());

static HRESULT Error(
    UINT nID,
    DWORD dwHelpID,
    LPCOLESTR lpszHelpFile,
    const IID& iid = GUID_NULL,
    HRESULT hRes = 0,
    HINSTANCE hInst = _AtlBaseModule.GetResourceInstance());

參數

lpszDesc
[in]描述錯誤的字串。 的 Error Unicode 版本會 指定 lpszDesc 的類型為 LPCOLESTR;ANSI 版本指定 LPCSTR 的類型。

iid
[in]如果錯誤是由作業系統所定義,則定義錯誤或GUID_NULL (預設值) 的介面 IID。

hRes
[in]您想要傳回給呼叫端的 HRESULT。 預設值為 0。 如需 hRes 的詳細資訊,請參閱。

nID
[in]儲存錯誤描述字串的資源識別碼。 此值應該介於0x0200與0xFFFF之間,並包含。 在偵錯組建中,如果 nID 未編製有效字串的索引,ASSERT 將會產生。 在發行組建中,錯誤描述字串會設定為「未知的錯誤」。

dwHelpID
[in]錯誤的說明內容識別碼。

lpszHelpFile
[in]描述錯誤的說明檔路徑和名稱。

hInst
[in]資源的句柄。 根據預設,此參數為 _AtlModule::GetResourceInstance,其中 _AtlModule 是 CAtlModule全域實例。

傳回值

標準 HRESULT 值。 如需詳細資料,請參閱<備註>。

備註

若要呼叫 Error,您的對象必須實作 ISupportErrorInfo 介面。

如果 hRes 參數為非零值,則會Error傳回 hRes 的值。 如果 hRes 為零,則傳回的前四個版本 Error DISP_E_EXCEPTION。 最後兩個版本會傳回 巨集 MAKE_HRESULT(1, FACILITY_ITF, nID 的結果。

CComCoClass::GetObjectCLSID

提供擷取物件 CLSID 的一致方式。

static const CLSID& WINAPI GetObjectCLSID();

傳回值

對象的類別識別碼。

CComCoClass::GetObjectDescription

此靜態函式會擷取類別物件的文字描述。

static LPCTSTR WINAPI GetObjectDescription();

傳回值

類別物件的描述。

備註

默認實作會傳回 NULL。 您可以使用DECLARE_OBJECT_DESCRIPTION巨集覆寫此方法。 例如:

class ATL_NO_VTABLE CMyDoc :
   public CComObjectRootEx<CComSingleThreadModel>,
   public CComCoClass<CMyDoc, &CLSID_MyDoc>,
   public IDocument
{
public:
   DECLARE_OBJECT_DESCRIPTION("My Document Object 1.0")

   // Remainder of class declaration omitted.

GetObjectDescriptionIComponentRegistrar::GetComponents呼叫。 IComponentRegistrar 是自動化介面,可讓您在 DLL 中註冊和取消註冊個別元件。 當您使用 ATL 專案精靈建立元件註冊器物件時,精靈會自動實 IComponentRegistrar 作 介面。 IComponentRegistrar 通常由 Microsoft Transaction Server 使用。

如需 ATL 專案精靈的詳細資訊,請參閱建立 ATL 專案一文

另請參閱

類別概觀