ホーム < ゲームつくろー! < クラス構築編 < 改・COMポインタテンプレートクラス(交換サポート):サンプルプログラム


改・COMポインタテンプレートクラス(交換サポート):サンプルプログラム


 クラス構築編『改・COMポインタテンプレートクラス(交換サポート)』で紹介したスワップ付きのCOMポインタテンプレートクラスを公開致します。ここではクラスのメンバメソッドと演算子の使い方を簡単にまとめました。

 ソースは冗長になるのでダウンロード形式に致します。こちらからダウンロードして下さい。現在のバージョンはv2.02(2008. 3. 20UP)です(バージョンレポートはこちら)。


○使用の注意

 このテンプレートクラスは「IKD」という名前空間で定義されています。使用する時にはIKD::Comptr<int>などと定義するか「using namespace IKD;」を用いて下さい。


○ メンバメソッド

公開メンバメソッド 説明 使い方 備考
Com_ptr(const int nullval)
Com_ptr(Com_ptr<T> &src)
template<class T2> Com_ptr(Com_ptr<T2> &src)
Com_ptr(T *pInterface=NULL, BOOL add=false)
コンストラクタ Com_ptr<IDirect3DTexture9> cpTex;
// 取得済みテクスチャインターフェイス
cpInt = pTex;  
COMポインタには必ずインターフェイス生成関数によって作成されたインターフェイスを渡して下さい。Com_ptr::ToCreatorメソッドを生成関数に渡すと、直接インターフェイスを格納する事ができます。
~Com_ptr() デストラクタ - -
ULONG* GetMyRefPtr() COMポインタ参照カウンタ変数へのポインタ取得 ULONG *pRef = cpTex.GetMyRefPtr(); COMポインタ自身の参照カウンタを格納しているULONG型のポインタを取得します。このメソッドを直接使用する事は殆どありません。
T* GetPtr() インターフェイスポインタを取得 D3DXCreateSprite( cpDev.GetPtr(), &pSprite ); 登録されているインターフェイスポインタを取得します。このメソッドはポインタを貸す働きをするため、DirectXに対してのみ適用し、他のCOMポインタにはポインタを渡さないようにして下さい。
T** GetPtrPtr() インターフェイスポインタへのポインタを取得 IDirect3DTexture9 **pp = cpTex.GetPtrPtr(); 登録されているインターフェイスポインタへのポインタを取得します。このメソッドを直接使用する事は殆どありません。生成関数はダブルポインタを要求しますが、その場合はこのメソッドではなくToCreatorメソッドを使ってください。
ULONG GetRefCnt() インターフェイスの参照数を取得 ULONG Num = cpTex.GetRefCnt(); COMインターフェイスの参照カウント数を取得します。これにはCOMポインタの共有数とDirectXコンポーネントによって増加されている分が含まれます。
bool Swap( Com_ptr<T> &src ) インターフェイスのグループ間スワップ cpTex1.Swap( cpTex2 ); 2つのグループ間でインターフェイスを丸ごと交換します。一方の参照数ともう一方の参照数も入れ替えられます。DirectX側はこの入れ替えに関与しません。
ToCreator() 生成関数へのダブルポインタの引渡し ID3DXSprite cpSprite;
D3DXCreateSprite( cpDev.GetPtr(), cpSprite.ToCreator() );
DirectXが多数用意している生成関数へダブルポインタを渡す専用メソッドです。このメソッドはCOMポインタを初期化状態で渡します。このメソッドを使用した時には、以前に登録されていたインターフェイスの参照カウンタを1つ減らし、その所有権を放棄します。
template<class T1> UpcastCopy( Com_ptr<T1> &src ) アップキャストコピー Com_ptr<IDirect3DBaseTexture9> cpBase;
Com_ptr<IDirect3DTexture9> cpTex;
cpBase.UpcastCopy( cpTex );
引数の派生インターフェイスを自身にアップキャストコピーします。




○ 演算子

演算子 説明 使い方 備考
! 論理Not演算子 Com_ptr<IDirect3DTexture9> cpTex1;
if( !cpTex1 )
   return true;  
インターフェイスが登録されていない(NULL)の場合trueを返します。
!= 比較演算子 Com_ptr<IDirect3DTexture9> cpTex1, cpTex2;
if( cpTex1 != cpTex2 )
   return true;
2つのインターフェイスポインタが異なる場合にtureを返します。実体の比較ではありませんので注意してください。
== 比較演算子 Com_ptr<IDirect3DTexture9> cpTex1, cpTex2;
if( cpTex1 == cpTex2 )
   return true;
2つのインターフェイスポインタが等しい場合にtureを返します。実体の比較ではありませんので注意してください。
= 代入演算子 Com_ptr<IDirect3DTexture9> cpTex1, cpTex2;
cpTex1 = cpTex2;
インターフェイスを共有する代入を行います。右辺には同型インターフェイスを格納したCOMポインタ、派生インターフェイスを格納したCOMポインタ、およびNULLを置く事ができます。また生成関数から取得したインターフェイスを代入する事もできます。
-> メンバ選択演算子 Com_ptr<IDirect3DTexture9> cpTex;
cpTex->GetDevice( cpDev.ToCreator() );
インターフェイスが持つメソッドを使用する時に使います。通常のポインタと同じ感覚で使用する事ができます。


○ バージョンレポート

・ v2.01->v2.02 (08. 3. 20)
ファイル出力フラグを立てた時に参照カウンタが正しく動作しないバグを修正

・ v2.00->v2.01 (07.3.7)
vectorなどのコンテナに格納できないバグを修正(コピーコンストラクタのミスを修正)

・ v1.00->v2.00 (07.3.1)
COMポインタのスワップをサポート。
DirectXが独自に増加させる参照カウンタによりCOMポインタ参照カウンタ変数が解放されないバグを修正

・ v1.00
基本動作サポート。