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。
您可以在類別定義中指定另一個巨集,以覆寫其中一個預設值。 例如,若要使用 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.
GetObjectDescription
由 IComponentRegistrar::GetComponents
呼叫。 IComponentRegistrar
是自動化介面,可讓您在 DLL 中註冊和取消註冊個別元件。 當您使用 ATL 專案精靈建立元件註冊器物件時,精靈會自動實 IComponentRegistrar
作 介面。 IComponentRegistrar
通常由 Microsoft Transaction Server 使用。
如需 ATL 專案精靈的詳細資訊,請參閱建立 ATL 專案一文。