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
では、次の 2 つのマクロが使用されます。
DECLARE_CLASSFACTORY クラス ファクトリが CComClassFactory であることを宣言します。
DECLARE_AGGREGATABLE: オブジェクトが集計できることを宣言します。
これらの既定値はいずれも、クラス定義で別のマクロを指定することでオーバーライドできます。 たとえば、CComClassFactory
の代わりに CComClassFactory2 を使用する場合、次のように 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
COM API を使用せずに COM オブジェクトのインスタンスを作成し、インターフェイス ポインターを取得するには、これらの CreateInstance
関数を使用します。
template <class Q>
static HRESULT CreateInstance( Q** pp);
template <class Q>
static HRESULT CreateInstance(IUnknown* punkOuter, Q** pp);
パラメーター
Q
pp を介して返される必要がある COM インターフェイス。
punkOuter
[入力] 外部の不明値または集計の "controlling unknown"。
pp
[出力] 作成が成功した場合に要求されたインターフェイス ポインターを受け取るポインター変数のアドレス。
戻り値
標準の HRESULT 値。 使用可能な戻り値の説明については、Windows SDK の「CoCreateInstance」を参照してください。
解説
一般的なオブジェクトの作成には、最初のオーバーロードを使用します。作成されるオブジェクトを集計する必要がある場合は、2 番目のオーバーロードを使用します。
必要な COM オブジェクトをっ実装する ATL クラス (CComCoClassへの最初のテンプレート パラメーターとして使用されるクラス) は、呼び出し元のコードと同じプロジェクト内にある必要があります。 COM オブジェクトの作成は、この ATL クラスに登録されているクラス ファクトリによって実行されます。
これらの関数は、OBJECT_ENTRY_NON_CREATEABLE_EX_AUTO マクロを使用して外部で作成できないようにしたオブジェクトを作成する場合に役立ちます。 また、効率上の理由から COM API を避ける必要がある場合にも役立ちます。
インターフェイス Q には、__uuidof 演算子を使用して取得できる IID が関連付けられている必要があることに注意してください。
例
次の例で、CDocument
は、IDocument
インターフェイスを実装する CComCoClass
から派生したウィザード生成の ATL クラスです。 クラスは、OBJECT_ENTRY_NON_CREATEABLE_EX_AUTO マクロと共にオブジェクト マップに登録されるため、クライアントで、CoCreateInstanceを使用してドキュメントのインスタンスを作成することはできません。 CApplication
は、ドキュメント クラスのインスタンスを作成するために、独自の COM インターフェイスの 1 つにメソッドを提供するコクラスです。 次のコードは、CComCoClass
基底クラスから継承される CreateInstance
メンバーを使用してドキュメント クラスのインスタンスを簡単に作成する方法を示しています。
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
[入力] エラーを説明する文字列。 Error
の Unicode バージョンでは、lpszDesc が LPCOLESTR 型であることを指定し、ANSI バージョンでは LPCSTR 型を指定します。
iid
[入力] エラーを定義するインターフェイスの IID。または、オペレーティング システムによってエラーが定義されている場合は GUID_NULL (既定値)。
hRes
[入力] 呼び出し元に返される HRESULT。 既定値は0です。 hRes の詳細については、「解説」を参照してください。
nID
[入力] エラー説明文字列が格納されているリソース識別子。 この値は、0x0200 から 0xFFFF の範囲で指定する必要があります。 デバッグ ビルドでは、nID で有効な文字列のインデックスが作成されない場合、ASSERT が発生します。 リリース ビルドでは、エラーの説明文字列が "不明なエラー" に設定されます。
dwHelpID
[入力] エラーのヘルプ コンテキスト識別子。
lpszHelpFile
[入力] エラーを説明するヘルプ ファイルのパスと名前。
hInst
[入力] リソースへのハンドル。 既定では、このパラメーターは _AtlModule::GetResourceInstance
です。ここで、_AtlModule
は CAtlModuleのグローバル インスタンスです。
戻り値
標準の HRESULT 値。 詳細については、「解説」を参照してください。
解説
Error
を呼び出すには、オブジェクトで ISupportErrorInfo
インターフェイスが実装されている必要があります。
hRes パラメーターが 0 以外の場合、Error
では hRes の値が返されます。 hRes が 0 の場合、Error
の最初の 4 つのバージョンでは DISP_E_EXCEPTION を返します。 最後の 2 つのバージョンは、マクロ 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 トランザクション サーバーによって使用されます。
ATL プロジェクト ウィザードの詳細については、「ATL プロジェクトの作成」を参照してください。