atlcore.h
上传用户:hfwmdy
上传日期:2016-01-14
资源大小:83k
文件大小:13k
源码类别:

GDI/图象编程

开发平台:

Visual C++

  1. // This is a part of the Active Template Library.
  2. // Copyright (C) Microsoft Corporation
  3. // All rights reserved.
  4. //
  5. // This source code is only intended as a supplement to the
  6. // Active Template Library Reference and related
  7. // electronic documentation provided with the library.
  8. // See these sources for detailed information regarding the
  9. // Active Template Library product.
  10. #ifndef __ATLCORE_H__
  11. #define __ATLCORE_H__
  12. #pragma once
  13. #ifdef _ATL_ALL_WARNINGS
  14. #pragma warning( push )
  15. #endif
  16. #pragma warning(disable: 4786) // identifier was truncated in the debug information
  17. #include <atldef.h>
  18. #include <windows.h>
  19. #include <ole2.h>
  20. #include <limits.h>
  21. #include <tchar.h>
  22. #include <mbstring.h>
  23. #include <atlchecked.h>
  24. #include <atlsimpcoll.h>
  25. #pragma pack(push,_ATL_PACKING)
  26. namespace ATL
  27. {
  28. /////////////////////////////////////////////////////////////////////////////
  29. // Verify that a null-terminated string points to valid memory
  30. inline BOOL AtlIsValidString(LPCWSTR psz, size_t nMaxLength = INT_MAX)
  31. {
  32. (nMaxLength);
  33. return (psz != NULL);
  34. }
  35. // Verify that a null-terminated string points to valid memory
  36. inline BOOL AtlIsValidString(LPCSTR psz, size_t nMaxLength = UINT_MAX)
  37. {
  38. (nMaxLength);
  39. return (psz != NULL);
  40. }
  41. // Verify that a pointer points to valid memory
  42. inline BOOL AtlIsValidAddress(const void* p, size_t nBytes,
  43. BOOL bReadWrite = TRUE)
  44. {
  45. (bReadWrite);
  46. (nBytes);
  47. return (p != NULL);
  48. }
  49. template<typename T>
  50. inline void AtlAssertValidObject(const T *pOb)
  51. {
  52. ATLASSERT(pOb);
  53. ATLASSERT(AtlIsValidAddress(pOb, sizeof(T)));
  54. if(pOb)
  55. pOb->AssertValid();
  56. }
  57. #ifdef _DEBUG
  58. #define ATLASSERT_VALID(x) ATL::AtlAssertValidObject(x)
  59. #else
  60. #define ATLASSERT_VALID(x) __noop;
  61. #endif
  62. // COM Sync Classes
  63. class CComCriticalSection
  64. {
  65. public:
  66. CComCriticalSection() throw()
  67. {
  68. memset(&m_sec, 0, sizeof(CRITICAL_SECTION));
  69. }
  70. ~CComCriticalSection()
  71. {
  72. }
  73. HRESULT Lock() throw()
  74. {
  75. EnterCriticalSection(&m_sec);
  76. return S_OK;
  77. }
  78. HRESULT Unlock() throw()
  79. {
  80. LeaveCriticalSection(&m_sec);
  81. return S_OK;
  82. }
  83. HRESULT Init() throw()
  84. {
  85. HRESULT hRes = E_FAIL;
  86. __try
  87. {
  88. InitializeCriticalSection(&m_sec);
  89. hRes = S_OK;
  90. }
  91. // structured exception may be raised in low memory situations
  92. __except(STATUS_NO_MEMORY == GetExceptionCode())
  93. {
  94. hRes = E_OUTOFMEMORY;
  95. }
  96. return hRes;
  97. }
  98. HRESULT Term() throw()
  99. {
  100. DeleteCriticalSection(&m_sec);
  101. return S_OK;
  102. }
  103. CRITICAL_SECTION m_sec;
  104. };
  105. class CComAutoCriticalSection : public CComCriticalSection
  106. {
  107. public:
  108. CComAutoCriticalSection()
  109. {
  110. HRESULT hr = CComCriticalSection::Init();
  111. if (FAILED(hr))
  112. AtlThrow(hr);
  113. }
  114. ~CComAutoCriticalSection() throw()
  115. {
  116. CComCriticalSection::Term();
  117. }
  118. private :
  119. HRESULT Init(); // Not implemented. CComAutoCriticalSection::Init should never be called
  120. HRESULT Term(); // Not implemented. CComAutoCriticalSection::Term should never be called
  121. };
  122. class CComSafeDeleteCriticalSection : public CComCriticalSection
  123. {
  124. public:
  125. CComSafeDeleteCriticalSection(): m_bInitialized(false) 
  126. {
  127. }
  128. ~CComSafeDeleteCriticalSection() throw()
  129. {
  130. if (!m_bInitialized)
  131. {
  132. return;
  133. }
  134. m_bInitialized = false;
  135. CComCriticalSection::Term();
  136. }
  137. HRESULT Init() throw()
  138. {
  139. ATLASSERT( !m_bInitialized );
  140. HRESULT hr = CComCriticalSection::Init();
  141. if (SUCCEEDED(hr))
  142. {
  143. m_bInitialized = true;
  144. }
  145. return hr;
  146. }
  147. HRESULT Term() throw()
  148. {
  149. if (!m_bInitialized)
  150. {
  151. return S_OK;
  152. }
  153. m_bInitialized = false;
  154. return CComCriticalSection::Term();
  155. }
  156. HRESULT Lock()
  157. {
  158. // CComSafeDeleteCriticalSection::Init or CComAutoDeleteCriticalSection::Init
  159. // not called or failed.
  160. // m_critsec member of CComObjectRootEx is now of type 
  161. // CComAutoDeleteCriticalSection. It has to be initialized
  162. // by calling CComObjectRootEx::_AtlInitialConstruct
  163. ATLASSUME(m_bInitialized);
  164. return CComCriticalSection::Lock();
  165. }
  166. private:
  167. bool m_bInitialized;
  168. };
  169. class CComAutoDeleteCriticalSection : public CComSafeDeleteCriticalSection
  170. {
  171. private:
  172. // CComAutoDeleteCriticalSection::Term should never be called
  173. HRESULT Term() throw();
  174. };
  175. class CComFakeCriticalSection
  176. {
  177. public:
  178. HRESULT Lock() throw() { return S_OK; }
  179. HRESULT Unlock() throw() { return S_OK; }
  180. HRESULT Init() throw() { return S_OK; }
  181. HRESULT Term() throw() { return S_OK; }
  182. };
  183. /////////////////////////////////////////////////////////////////////////////
  184. // Module 
  185. // Used by any project that uses ATL
  186. struct _ATL_BASE_MODULE70
  187. {
  188. UINT cbSize;
  189. HINSTANCE m_hInst;
  190. HINSTANCE m_hInstResource;
  191. bool m_bNT5orWin98;
  192. DWORD dwAtlBuildVer;
  193. const GUID* pguidVer;
  194. CComCriticalSection m_csResource;
  195. CSimpleArray<HINSTANCE> m_rgResourceInstance;
  196. };
  197. typedef _ATL_BASE_MODULE70 _ATL_BASE_MODULE;
  198. class CAtlBaseModule : public _ATL_BASE_MODULE
  199. {
  200. public :
  201. static bool m_bInitFailed;
  202. CAtlBaseModule() throw();
  203. ~CAtlBaseModule() throw ();
  204. HINSTANCE GetModuleInstance() throw()
  205. {
  206. return m_hInst;
  207. }
  208. HINSTANCE GetResourceInstance() throw()
  209. {
  210. return m_hInstResource;
  211. }
  212. HINSTANCE SetResourceInstance(HINSTANCE hInst) throw()
  213. {
  214. return static_cast< HINSTANCE >(InterlockedExchangePointer((void**)&m_hInstResource, hInst));
  215. }
  216. bool AddResourceInstance(HINSTANCE hInst) throw();
  217. bool RemoveResourceInstance(HINSTANCE hInst) throw();
  218. HINSTANCE GetHInstanceAt(int i) throw();
  219. };
  220. __declspec(selectany) bool CAtlBaseModule::m_bInitFailed = false;
  221. extern CAtlBaseModule _AtlBaseModule;
  222. /////////////////////////////////////////////////////////////////////////////
  223. // String resource helpers
  224. #pragma warning(push)
  225. #pragma warning(disable: 4200)
  226. struct ATLSTRINGRESOURCEIMAGE
  227. {
  228. WORD nLength;
  229. WCHAR achString[];
  230. };
  231. #pragma warning(pop) // C4200
  232. inline const ATLSTRINGRESOURCEIMAGE* _AtlGetStringResourceImage( HINSTANCE hInstance, HRSRC hResource, UINT id ) throw()
  233. {
  234. const ATLSTRINGRESOURCEIMAGE* pImage;
  235. const ATLSTRINGRESOURCEIMAGE* pImageEnd;
  236. ULONG nResourceSize;
  237. HGLOBAL hGlobal;
  238. UINT iIndex;
  239. hGlobal = ::LoadResource( hInstance, hResource );
  240. if( hGlobal == NULL )
  241. {
  242. return( NULL );
  243. }
  244. pImage = (const ATLSTRINGRESOURCEIMAGE*)::LockResource( hGlobal );
  245. if( pImage == NULL )
  246. {
  247. return( NULL );
  248. }
  249. nResourceSize = ::SizeofResource( hInstance, hResource );
  250. pImageEnd = (const ATLSTRINGRESOURCEIMAGE*)(LPBYTE( pImage )+nResourceSize);
  251. iIndex = id&0x000f;
  252. while( (iIndex > 0) && (pImage < pImageEnd) )
  253. {
  254. pImage = (const ATLSTRINGRESOURCEIMAGE*)(LPBYTE( pImage )+(sizeof( ATLSTRINGRESOURCEIMAGE )+(pImage->nLength*sizeof( WCHAR ))));
  255. iIndex--;
  256. }
  257. if( pImage >= pImageEnd )
  258. {
  259. return( NULL );
  260. }
  261. if( pImage->nLength == 0 )
  262. {
  263. return( NULL );
  264. }
  265. return( pImage );
  266. }
  267. inline const ATLSTRINGRESOURCEIMAGE* AtlGetStringResourceImage( HINSTANCE hInstance, UINT id ) throw()
  268. {
  269. HRSRC hResource;
  270. hResource = ::FindResource( hInstance, MAKEINTRESOURCE( ((id>>4)+1) ), RT_STRING );
  271. if( hResource == NULL )
  272. {
  273. return( NULL );
  274. }
  275. return _AtlGetStringResourceImage( hInstance, hResource, id );
  276. }
  277. inline const ATLSTRINGRESOURCEIMAGE* AtlGetStringResourceImage( HINSTANCE hInstance, UINT id, WORD wLanguage ) throw()
  278. {
  279. HRSRC hResource;
  280. hResource = ::FindResourceEx( hInstance, RT_STRING, MAKEINTRESOURCE( ((id>>4)+1) ), wLanguage );
  281. if( hResource == NULL )
  282. {
  283. return( NULL );
  284. }
  285. return _AtlGetStringResourceImage( hInstance, hResource, id );
  286. }
  287. inline const ATLSTRINGRESOURCEIMAGE* AtlGetStringResourceImage( UINT id ) throw()
  288. {
  289. const ATLSTRINGRESOURCEIMAGE* p = NULL;
  290. HINSTANCE hInst = _AtlBaseModule.GetHInstanceAt(0);
  291. for (int i = 1; hInst != NULL && p == NULL; hInst = _AtlBaseModule.GetHInstanceAt(i++))
  292. {
  293. p = AtlGetStringResourceImage(hInst, id);
  294. }
  295. return p;
  296. }
  297. inline const ATLSTRINGRESOURCEIMAGE* AtlGetStringResourceImage( UINT id, WORD wLanguage ) throw()
  298. {
  299. const ATLSTRINGRESOURCEIMAGE* p = NULL;
  300. HINSTANCE hInst = _AtlBaseModule.GetHInstanceAt(0);
  301. for (int i = 1; hInst != NULL && p == NULL; hInst = _AtlBaseModule.GetHInstanceAt(i++))
  302. {
  303. p = AtlGetStringResourceImage(hInst, id, wLanguage);
  304. }
  305. return p;
  306. }
  307. inline int AtlLoadString(__in UINT nID, __out_ecount_part_z(nBufferMax, return + 1) LPTSTR lpBuffer, __in int nBufferMax) throw()
  308. {
  309. HINSTANCE hInst = _AtlBaseModule.GetHInstanceAt(0);
  310. int nRet = 0;
  311. for (int i = 1; hInst != NULL && nRet == 0; hInst = _AtlBaseModule.GetHInstanceAt(i++))
  312. {
  313. nRet = LoadString(hInst, nID, lpBuffer, nBufferMax);
  314. }
  315. return nRet;
  316. }
  317. inline HINSTANCE AtlFindResourceInstance(LPCTSTR lpName, LPCTSTR lpType, WORD wLanguage = 0) throw()
  318. {
  319. ATLASSERT(lpType != RT_STRING); // Call AtlFindStringResourceInstance to find the string
  320. if (lpType == RT_STRING)
  321. return NULL;
  322. if (ATL_IS_INTRESOURCE(lpType))
  323. {
  324. /* Prefast false warnings caused by bad-shaped definition of MAKEINTRESOURCE macro from PSDK */
  325. if (lpType == ATL_RT_ICON)
  326. {
  327. lpType = ATL_RT_GROUP_ICON;
  328. }
  329. else if (lpType == ATL_RT_CURSOR)
  330. {
  331. lpType = ATL_RT_GROUP_CURSOR;
  332. }
  333. }
  334. HINSTANCE hInst = _AtlBaseModule.GetHInstanceAt(0);
  335. HRSRC hResource = NULL;
  336. for (int i = 1; hInst != NULL; hInst = _AtlBaseModule.GetHInstanceAt(i++))
  337. {
  338. hResource = ::FindResourceEx(hInst, lpType, lpName, wLanguage);
  339. if (hResource != NULL)
  340. {
  341. return hInst;
  342. }
  343. }
  344. return NULL;
  345. }
  346. inline HINSTANCE AtlFindResourceInstance(UINT nID, LPCTSTR lpType, WORD wLanguage = 0) throw()
  347. {
  348. return AtlFindResourceInstance(MAKEINTRESOURCE(nID), lpType, wLanguage);
  349. }
  350. inline HINSTANCE AtlFindStringResourceInstance(UINT nID, WORD wLanguage = 0) throw()
  351. {
  352. const ATLSTRINGRESOURCEIMAGE* p = NULL;
  353. HINSTANCE hInst = _AtlBaseModule.GetHInstanceAt(0);
  354. for (int i = 1; hInst != NULL && p == NULL; hInst = _AtlBaseModule.GetHInstanceAt(i++))
  355. {
  356. p = AtlGetStringResourceImage(hInst, nID, wLanguage);
  357. if (p != NULL)
  358. return hInst;
  359. }
  360. return NULL;
  361. }
  362. /* 
  363. Needed by both atlcomcli and atlsafe, so needs to be in here 
  364. */
  365. inline HRESULT AtlSafeArrayGetActualVartype
  366. (
  367.     SAFEARRAY *psaArray,
  368.     VARTYPE *pvtType
  369. )
  370. {
  371.     HRESULT hrSystem=::SafeArrayGetVartype(psaArray, pvtType);
  372.     if(FAILED(hrSystem))
  373.     {
  374.         return hrSystem;
  375.     }
  376.     /* 
  377.     When Windows has a SAFEARRAY of type VT_DISPATCH with FADF_HAVEIID,
  378.     it returns VT_UNKNOWN instead of VT_DISPATCH. We patch the value to be correct
  379.     */
  380.     if(pvtType && *pvtType==VT_UNKNOWN)
  381.     {
  382.         if(psaArray && ((psaArray->fFeatures & FADF_HAVEIID)!=0))
  383.         {
  384.             if(psaArray->fFeatures & FADF_DISPATCH)
  385.             {
  386.                 *pvtType=VT_DISPATCH;
  387.             }
  388.         }
  389.     }
  390.     return hrSystem;
  391. }
  392. template <typename _CharType>
  393. inline _CharType* AtlCharNext(const _CharType* p) throw()
  394. {
  395. ATLASSUME(p != NULL); // Too expensive to check separately here 
  396. if (*p == '')  // ::CharNextA won't increment if we're at a  already
  397. return const_cast<_CharType*>(p+1);
  398. else
  399. return ::CharNextA(p);
  400. }
  401. template <>
  402. inline wchar_t* AtlCharNext<wchar_t>(const wchar_t* p) throw()
  403. {
  404. return const_cast< wchar_t* >( p+1 );
  405. }
  406. template<typename CharType>
  407. inline const CharType* AtlstrchrT(const CharType* p, CharType ch) throw()
  408. {
  409. ATLASSERT(p != NULL);
  410. if(p==NULL)
  411. {
  412. return NULL;
  413. }
  414. while( *p != 0 )
  415. {
  416. if (*p == ch)
  417. {
  418. return p;
  419. }
  420. p = AtlCharNext(p);
  421. }
  422. //strchr for '' should succeed - the while loop terminates 
  423. //*p == 0, but ch also == 0, so NULL terminator address is returned
  424. return (*p == ch) ? p : NULL;
  425. }
  426. //Ansi and Unicode versions of printf, used with templated CharType trait classes.
  427. #pragma warning(push)
  428. #pragma warning(disable : 4793)
  429. template<typename CharType>
  430. inline int AtlprintfT(const CharType* pszFormat,... ) throw()
  431. {
  432. int retval=0;
  433. va_list argList;
  434. va_start( argList, pszFormat );
  435. retval=vprintf(pszFormat,argList);
  436. va_end( argList );
  437. return retval;
  438. }
  439. #pragma warning(pop)
  440. #pragma warning(push)
  441. #pragma warning(disable : 4793)
  442. template<>
  443. inline int AtlprintfT(const wchar_t* pszFormat,... ) throw()
  444. {
  445. int retval=0;
  446. va_list argList;
  447. va_start( argList, pszFormat );
  448. retval=vwprintf(pszFormat, argList);
  449. va_end( argList );
  450. return retval;
  451. }
  452. #pragma warning(pop)
  453. inline BOOL AtlConvertSystemTimeToVariantTime(const SYSTEMTIME& systimeSrc,double* pVarDtTm)
  454. {
  455. ATLENSURE(pVarDtTm!=NULL);
  456. //Convert using ::SystemTimeToVariantTime and store the result in pVarDtTm then
  457. //convert variant time back to system time and compare to original system time.
  458. BOOL ok = ::SystemTimeToVariantTime(const_cast<SYSTEMTIME*>(&systimeSrc), pVarDtTm);
  459. SYSTEMTIME sysTime;
  460. ::ZeroMemory(&sysTime, sizeof(SYSTEMTIME));
  461. ok = ok && ::VariantTimeToSystemTime(*pVarDtTm, &sysTime);
  462. ok = ok && (systimeSrc.wYear == sysTime.wYear &&
  463. systimeSrc.wMonth == sysTime.wMonth &&
  464. systimeSrc.wDay == sysTime.wDay &&
  465. systimeSrc.wHour == sysTime.wHour &&
  466. systimeSrc.wMinute == sysTime.wMinute && 
  467. systimeSrc.wSecond == sysTime.wSecond);
  468. return ok;
  469. }
  470. /////////////////////////////////////////////////////////////////////////////
  471. } // namespace ATL
  472. #pragma pack(pop)
  473. #ifdef _ATL_ALL_WARNINGS
  474. #pragma warning( pop )
  475. #endif
  476. #endif // __ATLCORE_H__