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
00011
00012
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
00035
00036
00037 class SPR_DLL WXUnknown{
00038 protected:
00039
00040 IUnknown* intf;
00041
00042 public:
00043
00044 WXUnknown(const WXUnknown& u);
00045
00046 WXUnknown(IUnknown* i = NULL);
00047
00048
00049 virtual ~WXUnknown();
00050
00051
00052 WXUnknown& operator = (const WXUnknown& o);
00053
00054
00055 virtual const IID& InterfaceID() const;
00056
00057
00058 virtual const CLSID& ClassID() const;
00059
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
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
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
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 }
00149 #endif