メインページ | ネームスペース一覧 | クラス階層 | 構成 | Directories | ファイル一覧 | ネームスペースメンバ | 構成メンバ | ファイルメンバ | 関連ページ

WXComBase.h

00001 #ifndef Spr_DX_CUNKNOWN_H
00002 #define Spr_DX_CUNKNOWN_H
00003 #if _MSC_VER >= 1000
00004 # pragma once
00005 #endif // _MSC_VER >= 1000
00006 
00007 #undef  __RPCNDR_H_VERSION__
00008 #define __RPCNDR_H_VERSION__        ( 475 )
00009 
00010 /** 使用するDirectXのバージョン(Dx8以降,7以前はWinDXOldが対応予定)
00011     ここを書き換えたら,WinDXLib.bat を書き換えてください.
00012     また,SpringheadGUI.bpg のライブラリも変更してください.*/
00013 #ifndef SPR_DXVER
00014 # define SPR_DXVER 9
00015 #endif
00016 
00017 #include <WinBasis/WBWin.h>
00018 #include <Base/BaseUtility.h>
00019 
00020 #ifdef __BORLANDC__
00021 #define sqrtf sqrt
00022 #endif
00023 
00024 namespace Spr {
00025 
00026 template <class T>
00027 void RELEASE(T& x){
00028     if (x){
00029         x->Release();
00030         x = NULL;
00031     }
00032 }
00033 
00034 /** IUnknown のラッパ
00035     
00036 */
00037 class SPR_DLL WXUnknown{
00038 protected:
00039     /// IUnknownへのポインタ
00040     IUnknown* intf;
00041 
00042 public:
00043     /// コピーコンストラクタ,u がNULLでなければ参照カウンタを増やす(IUnknown::AddRefを呼ぶ)
00044     WXUnknown(const WXUnknown& u);
00045     /// 構築,pObj がNULLでなければ参照カウンタを増やす(IUnknown::AddRefを呼ぶ)
00046     WXUnknown(IUnknown* i = NULL);
00047 
00048     /// 破棄,参照を減らす(IUnknown::Releaseを呼ぶ)
00049     virtual ~WXUnknown();
00050 
00051     /// 代入,Release()後,pObject=o.pObjectとし,参照を増やす.
00052     WXUnknown& operator = (const WXUnknown& o);
00053 
00054     /// COMインターフェイスのGUID
00055     virtual const IID& InterfaceID() const;
00056 
00057     /// COMクラスのGUID
00058     virtual const CLSID& ClassID() const;
00059     /// IUnknown への参照を減らし,pObject=NULLとする.
00060     virtual void Release();
00061 };
00062 
00063 #define WXINTF(OBJ) WXInterface<I##OBJ, &IID_I##OBJ>
00064 #if SPR_DXVER==8
00065 # define WXINTFV(OBJ) WXInterface<I##OBJ##8, &IID_I##OBJ##8>
00066 #elif SPR_DXVER==9
00067 # define WXINTFV(OBJ) WXInterface<I##OBJ##9, &IID_I##OBJ##9>
00068 #endif
00069 
00070 /** COMインタフェースのラッパ.
00071 */
00072 template <class IF, const IID* iid>
00073 class WXInterface: public WXUnknown{
00074 public:
00075     ///
00076     typedef IF intf_type;
00077     ///
00078     typedef WXInterface<intf_type, iid> base_type;
00079     ///
00080     WXInterface(IF* i = NULL): WXUnknown(i){}
00081     ///
00082     WXInterface(IUnknown* i):WXUnknown(NULL){
00083         if (i) i->QueryInterface(iid, &Intf());
00084     }
00085     ///
00086     IF*& Intf(){ return (IF*&)intf; }
00087     ///
00088     IF* Intf() const { return (IF*)intf; }
00089     ///
00090     IF* operator ->() const { return Intf(); }
00091     ///
00092     operator IF*() const { return Intf(); }
00093     ///
00094     WXInterface<intf_type, iid>& operator =(intf_type* t){
00095         if (Intf()) Intf()->Release();
00096         Intf() = t;
00097         if (Intf()) Intf()->AddRef();
00098         return *this;
00099     }
00100     /// COMインターフェイスのGUID
00101     virtual const IID& InterfaceID() const{ return *iid; }
00102     ///
00103     const IID& InterfaceIDStatic(){ return *iid; }
00104 };
00105 
00106 
00107 #define WXSINGLETON(OBJ) WXSingletonInterface<I##OBJ, &IID_I##OBJ>
00108 #if SPR_DXVER==8
00109 #define WXSINGLETONV(OBJ) WXSingletonInterface<I##OBJ##8, &IID_I##OBJ##8>
00110 #elif SPR_DXVER==9
00111 #define WXSINGLETONV(OBJ) WXSingletonInterface<I##OBJ##9, &IID_I##OBJ##9>
00112 #endif
00113 /** シングルトン用ラッパー.
00114     プログラム全体で確実にひとつだけ実体が生成される.
00115     メインより前でも確実に使用できる.
00116     プログラム終了時に開放される.
00117 */
00118 template <class IF, const IID* iid>
00119 class WXSingletonInterface:public WXInterface<IF, iid>{
00120 public:
00121     /// コンストラクタ
00122     void Prepare(){
00123         if (Intf()) return;
00124         WXInterface<IF,iid>& singleton = Singleton< WXInterface<IF,iid> >();
00125         if (!singleton.Intf()){
00126             singleton.Intf() = (IF*)Create();
00127         }
00128         Intf() = singleton.Intf();
00129         if (Intf()) Intf()->AddRef();
00130     }
00131     /** インタフェースを生成して返す関数.
00132         プログラム全体で1度だけ呼ばれる可能性がある.
00133     */
00134     virtual IUnknown* Create()=0;
00135 };
00136 
00137 class SPR_DLL WXComInitImp: public UTRefCount{
00138 public:
00139     WXComInitImp();
00140     ~WXComInitImp();
00141     static WXComInitImp* comInitImp;
00142 };
00143 class SPR_DLL WXComInit:public UTRef<WXComInitImp>{
00144 public:
00145     WXComInit();
00146 };
00147 
00148 }   //  namespace Spr
00149 #endif

Springheadに対してSun Apr 16 01:57:59 2006に生成されました。  doxygen 1.4.1