00001
00002
00003
00004
00005
00006 #include <streams.h>
00007 #pragma warning( disable : 4514 )
00008
00009 LONG CBaseObject::m_cObjects = 0;
00010
00011 CBaseObject::CBaseObject(const TCHAR *pName)
00012 {
00013
00014 InterlockedIncrement(&m_cObjects);
00015
00016 #ifdef DEBUG
00017
00018 #ifdef UNICODE
00019 m_dwCookie = DbgRegisterObjectCreation(0, pName);
00020 #else
00021 m_dwCookie = DbgRegisterObjectCreation(pName, 0);
00022 #endif
00023
00024 #endif
00025 }
00026
00027 #ifdef UNICODE
00028 CBaseObject::CBaseObject(const char *pName)
00029 {
00030
00031 InterlockedIncrement(&m_cObjects);
00032
00033 #ifdef DEBUG
00034 m_dwCookie = DbgRegisterObjectCreation(pName, 0);
00035 #endif
00036 }
00037 #endif
00038
00039 HINSTANCE hlibOLEAut32;
00040
00041 CBaseObject::~CBaseObject()
00042 {
00043
00044 if (InterlockedDecrement(&m_cObjects) == 0) {
00045 if (hlibOLEAut32) {
00046 FreeLibrary(hlibOLEAut32);
00047
00048 hlibOLEAut32 = 0;
00049 }
00050 };
00051
00052 #ifdef DEBUG
00053 DbgRegisterObjectDestruction(m_dwCookie);
00054 #endif
00055 }
00056
00057 static const TCHAR szOle32Aut[] = TEXT("OleAut32.dll");
00058
00059 HINSTANCE LoadOLEAut32()
00060 {
00061 if (hlibOLEAut32 == 0) {
00062
00063 hlibOLEAut32 = LoadLibrary(szOle32Aut);
00064 }
00065
00066 return hlibOLEAut32;
00067 }
00068
00069 #pragma warning( disable : 4355 4100 )
00070 CUnknown::CUnknown(const TCHAR *pName, LPUNKNOWN pUnk)
00071 : CBaseObject(pName)
00072
00073 , m_cRef(0)
00074
00075 , m_pUnknown( pUnk != 0 ? pUnk : reinterpret_cast<LPUNKNOWN>( static_cast<PNDUNKNOWN>(this) ) )
00076
00077 {
00078
00079 }
00080
00081 CUnknown::CUnknown(TCHAR *pName, LPUNKNOWN pUnk,HRESULT *phr) :
00082 CBaseObject(pName),
00083 m_cRef(0),
00084 m_pUnknown( pUnk != 0 ? pUnk : reinterpret_cast<LPUNKNOWN>( static_cast<PNDUNKNOWN>(this) ) )
00085 {
00086 }
00087
00088 #ifdef UNICODE
00089 CUnknown::CUnknown(const CHAR *pName, LPUNKNOWN pUnk)
00090 : CBaseObject(pName), m_cRef(0),
00091 m_pUnknown( pUnk != 0 ? pUnk : reinterpret_cast<LPUNKNOWN>( static_cast<PNDUNKNOWN>(this) ) )
00092 { }
00093
00094 CUnknown::CUnknown(CHAR *pName, LPUNKNOWN pUnk,HRESULT *phr) :
00095 CBaseObject(pName), m_cRef(0),
00096 m_pUnknown( pUnk != 0 ? pUnk : reinterpret_cast<LPUNKNOWN>( static_cast<PNDUNKNOWN>(this) ) )
00097 { }
00098
00099 #endif
00100
00101 #pragma warning( default : 4355 4100 )
00102
00103 STDMETHODIMP CUnknown::NonDelegatingQueryInterface(REFIID riid, void ** ppv)
00104 {
00105 CheckPointer(ppv,E_POINTER);
00106 ValidateReadWritePtr(ppv,sizeof(PVOID));
00107
00108 if (riid == IID_IUnknown) {
00109 GetInterface((LPUNKNOWN) (PNDUNKNOWN) this, ppv);
00110 return NOERROR;
00111 } else {
00112 *ppv = NULL;
00113 return E_NOINTERFACE;
00114 }
00115 }
00116
00117 template<class T> inline static T ourmax( const T & a, const T & b )
00118 {
00119 return a > b ? a : b;
00120 }
00121
00122 STDMETHODIMP_(ULONG) CUnknown::NonDelegatingAddRef()
00123 {
00124 LONG lRef = InterlockedIncrement( &m_cRef );
00125 ASSERT(lRef > 0);
00126 DbgLog((LOG_MEMORY,3,TEXT(" Obj %d ref++ = %d"),
00127 m_dwCookie, m_cRef));
00128 return ourmax(ULONG(m_cRef), 1ul);
00129 }
00130
00131 STDMETHODIMP_(ULONG) CUnknown::NonDelegatingRelease()
00132 {
00133
00134
00135 LONG lRef = InterlockedDecrement( &m_cRef );
00136 ASSERT(lRef >= 0);
00137
00138 DbgLog((LOG_MEMORY,3,TEXT(" Object %d ref-- = %d"),
00139 m_dwCookie, m_cRef));
00140 if (lRef == 0) {
00141
00142 m_cRef++;
00143
00144 delete this;
00145 return ULONG(0);
00146 } else {
00147 return ourmax(ULONG(m_cRef), 1ul);
00148 }
00149 }
00150
00151 STDAPI GetInterface(LPUNKNOWN pUnk, void **ppv)
00152 {
00153 CheckPointer(ppv, E_POINTER);
00154 *ppv = pUnk;
00155 pUnk->AddRef();
00156 return NOERROR;
00157 }
00158
00159 BOOL WINAPI IsEqualObject(IUnknown *pFirst, IUnknown *pSecond)
00160 {
00161
00162 if (pFirst == pSecond) {
00163 return TRUE;
00164 }
00165
00166 LPUNKNOWN pUnknown1;
00167 LPUNKNOWN pUnknown2;
00168 HRESULT hr;
00169
00170 ASSERT(pFirst);
00171 ASSERT(pSecond);
00172
00173 hr = pFirst->QueryInterface(IID_IUnknown,(void **) &pUnknown1);
00174 ASSERT(SUCCEEDED(hr));
00175 ASSERT(pUnknown1);
00176
00177 hr = pSecond->QueryInterface(IID_IUnknown,(void **) &pUnknown2);
00178 ASSERT(SUCCEEDED(hr));
00179 ASSERT(pUnknown2);
00180
00181 pUnknown1->Release();
00182 pUnknown2->Release();
00183 return (pUnknown1 == pUnknown2);
00184 }
00185