ケースの側面の下では、COMコンポーネントは次のようになります。
ATL_NO_VTABLE cmathクラス:
公共CComObjectRootEx <CComSingleThreadModel>、
公共CComCoClass、<cmath、&CLSID_Math>、
公共IMath、
公共IAdvancedMath
{
...
}
CMathは、ユーザーによって定義されたが、それはつまり、CMathから継承したクラスが存在しなければならない、実際には抽象クラスです。これは、デフォルトのクラスはCCOMObject <CMath>で提供します。それは3つのインターフェースのIUnknowを提供する、のAddRef()、リリース() 、のQueryInterface()。
仮想ポインタを使用しないようにするために、テンプレートを使用する理由はなく、機能の多型を実現。
CMathは、ジョブ・クラスのファクトリインターフェイスを取得するには、レジストリに登録のシリーズをカプセル化しCComCoClassから継承されました。
CComCoClassの定義を見てください。
テンプレートは<クラスT、pClsid =定数*&CLSID_NULL CLSID>
クラスCComCoClass、
{
パブリック:
DECLARE_CLASSFACTORY()
DECLARE_AGGREGATABLE(T)
T _CoClassのtypedef;
...
}
DECLARE_CLASSFACTORYで定義されました。
DECLARE_CLASSFACTORYの#define()\
; typedefをCComCreator <CComObjectCached <CComClassFactory >> _ClassFactoryCreatorClass
DECLARE_AGGREGATABLEで定義されています。
#define DECLARE_AGGREGATABLE(x)の公共:\
CComCreator2 <CComCreator <CComObject <X>>、CComCreator <CComAggObject <X>>> _CreatorClassのtypedef。
_ClassFactoryCreatorClassと_CreatorClass 2つのtypedef用
BEGIN_OBJECT_MAP(のObjectMap)
OBJECT_ENTRY(CLSID_Math、cmath)
END_OBJECT_MAP()
これらのマクロは、テーブルを生成します。要素要素テーブルはCLSID_Math、CMathです:: _ ClassFactoryCreatorClass :: CreateInstanceを 、CMath :: _ CreatorClass :: CreateInstanceを、 ようにと。
CMath :: _ ClassFactoryCreatorClass ::対応するクラスファクトリインターフェイスを生成するためのCreateInstanceメソッド。
インタフェースを生成するために、対応するクラスのCMath :: _ CreatorClass :: CreateInstanceメソッド。
以下のような使用方法:
のIClassFactory PFCは* = NULL;
cmath :: _ :: ClassFactoryCreatorClassのCreateInstance(NULL、IID_IClassFactory、(**ボイド)およびPFC);
IAdvancedMath * P = NULL;
のCreateInstance cmath :: _ :: CreatorClass(NULL、IID_IAdvancedMath、(ボイド**)&P);
_ClassFactoryCreatorClass定義を振り返ります。
CComCreatorのtypedef <CComObjectCached <CComClassFactory >> _ClassFactoryCreatorClass;
CComObjectCached <CComClassFactory> CComClassFactoryから継承されています。CCOMObjectのような機能をCComObjectCached。ちょうどクラスファクトリのために、キャッシュ・メカニズムがあることを除いて。
CComCreator CComObjectCached <CComClassFactory> CreateInstanceメソッド。
_CreatorClass定義を振り返ります。
CComCreator2のtypedef <CComCreator <CComObject <X >>、CComCreator <CComAggObject <X >>> _CreatorClass;
CComCreator2非ポリマーまたはポリマー。非ポリマーCComCreator <CComObject <X>を使用している場合場合は、CComCreator <CComAggObject <X >>と重合。
コンポーネントの作成
CComObject <CMath> * ptrMath。
CComObject <CMath> :: CreateInstanceを(&ptrMath)。
CComPtr <IMath> pMath = ptrMath。
ます。https://www.cnblogs.com/fanzi2009/archive/2010/04/19/1715418.htmlで再現