ATLの学習のまとめ

ケースの側面の下では、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で再現

おすすめ

転載: blog.csdn.net/weixin_33881140/article/details/94192405