afxstate.cpp 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. // This is a part of the Microsoft Foundation Classes C++ library.
  2. // Copyright (C) 1992-1998 Microsoft Corporation
  3. // All rights reserved.
  4. //
  5. // This source code is only intended as a supplement to the
  6. // Microsoft Foundation Classes Reference and related
  7. // electronic documentation provided with the library.
  8. // See these sources for detailed information regarding the
  9. // Microsoft Foundation Classes product.
  10. #include "stdafx.h"
  11. #include <stddef.h>
  12. #ifdef AFX_INIT_SEG
  13. #pragma code_seg(AFX_INIT_SEG)
  14. #endif
  15. #ifdef _DEBUG
  16. #undef THIS_FILE
  17. static char THIS_FILE[] = __FILE__;
  18. #endif
  19. #pragma warning(disable: 4074)
  20. #pragma init_seg(compiler)
  21. /////////////////////////////////////////////////////////////////////////////
  22. // AFX_MODULE_STATE push/pop implementation
  23. #ifdef _AFXDLL
  24. AFX_MODULE_STATE* AFXAPI AfxSetModuleState(AFX_MODULE_STATE* pNewState)
  25. {
  26. _AFX_THREAD_STATE* pState = _afxThreadState;
  27. AFX_MODULE_STATE* pPrevState = pState->m_pModuleState;
  28. pState->m_pModuleState = pNewState;
  29. return pPrevState;
  30. }
  31. AFX_MAINTAIN_STATE::~AFX_MAINTAIN_STATE()
  32. {
  33. _AFX_THREAD_STATE* pState = _afxThreadState;
  34. pState->m_pModuleState = m_pPrevModuleState;
  35. }
  36. AFX_MAINTAIN_STATE2::AFX_MAINTAIN_STATE2(AFX_MODULE_STATE* pNewState)
  37. {
  38. m_pThreadState = _afxThreadState;
  39. m_pPrevModuleState = m_pThreadState->m_pModuleState;
  40. m_pThreadState->m_pModuleState = pNewState;
  41. }
  42. #endif //_AFXDLL
  43. /////////////////////////////////////////////////////////////////////////////
  44. // _AFX_THREAD_STATE implementation
  45. _AFX_THREAD_STATE::_AFX_THREAD_STATE()
  46. {
  47. m_nLastHit = -1;
  48. m_nLastStatus = -1;
  49. }
  50. _AFX_THREAD_STATE::~_AFX_THREAD_STATE()
  51. {
  52. // cleanup thread local tooltip window
  53. /*if (m_pToolTip != NULL)
  54. {
  55. m_pToolTip->DestroyWindow();
  56. delete m_pToolTip;
  57. }*/
  58. // unhook windows hooks
  59. if (m_hHookOldMsgFilter != NULL)
  60. ::UnhookWindowsHookEx(m_hHookOldMsgFilter);
  61. if (m_hHookOldCbtFilter != NULL)
  62. ::UnhookWindowsHookEx(m_hHookOldCbtFilter);
  63. // free safety pool buffer
  64. if (m_pSafetyPoolBuffer != NULL)
  65. free(m_pSafetyPoolBuffer);
  66. // parking window must have already been cleaned up by now!
  67. ASSERT(m_pWndPark == NULL);
  68. }
  69. _AFX_THREAD_STATE* AFXAPI AfxGetThreadState()
  70. {
  71. return _afxThreadState.GetData();
  72. }
  73. THREAD_LOCAL(_AFX_THREAD_STATE, _afxThreadState)
  74. /////////////////////////////////////////////////////////////////////////////
  75. // AFX_MODULE_STATE implementation
  76. #ifdef _AFXDLL
  77. AFX_MODULE_STATE::AFX_MODULE_STATE(BOOL bDLL, WNDPROC pfnAfxWndProc,
  78. DWORD dwVersion, BOOL bSystem)
  79. #else
  80. AFX_MODULE_STATE::AFX_MODULE_STATE(BOOL bDLL)
  81. #endif
  82. {
  83. #ifndef _AFX_NO_OLE_SUPPORT
  84. m_factoryList.Construct(offsetof(COleObjectFactory, m_pNextFactory));
  85. #endif
  86. m_classList.Construct(offsetof(CRuntimeClass, m_pNextClass));
  87. m_fRegisteredClasses = 0;
  88. m_bDLL = (BYTE)bDLL;
  89. #ifdef _AFXDLL
  90. m_pfnAfxWndProc = pfnAfxWndProc;
  91. m_dwVersion = dwVersion;
  92. m_bSystem = (BYTE)bSystem;
  93. #endif
  94. // app starts out in "user control"
  95. m_bUserCtrl = TRUE;
  96. #ifndef _AFX_NO_OCC_SUPPORT
  97. m_lockList.Construct(offsetof(COleControlLock, m_pNextLock));
  98. #endif
  99. #ifdef _AFXDLL
  100. m_libraryList.Construct(offsetof(CDynLinkLibrary, m_pNextDLL));
  101. #endif
  102. #ifdef _AFX_OLD_EXCEPTIONS
  103. m_pfnTerminate = AfxAbort;
  104. #endif
  105. }
  106. // Note: this constructor is purely for backward compatibility to the ISV drop
  107. #ifdef _AFXDLL
  108. AFX_MODULE_STATE::AFX_MODULE_STATE(BOOL bDLL, WNDPROC pfnAfxWndProc,
  109. DWORD dwVersion)
  110. {
  111. ::new((void*)this) AFX_MODULE_STATE(bDLL, pfnAfxWndProc, dwVersion, FALSE);
  112. }
  113. #endif
  114. AFX_MODULE_STATE::~AFX_MODULE_STATE()
  115. {
  116. #ifndef _AFX_NO_DAO_SUPPORT
  117. delete m_pDaoState;
  118. #endif
  119. // clean up type lib cache map, if any
  120. /*if (m_pTypeLibCacheMap != NULL)
  121. {
  122. m_pTypeLibCacheMap->RemoveAll(&m_typeLibCache);
  123. delete m_pTypeLibCacheMap;
  124. }*/
  125. }
  126. void CTypeLibCacheMap::RemoveAll(void* pExcept)
  127. {
  128. POSITION pos = GetStartPosition();
  129. void* pTypeLibID;
  130. CTypeLibCache* pCache;
  131. while (pos != NULL)
  132. {
  133. GetNextAssoc(pos, pTypeLibID, (void*&)pCache);
  134. if (pCache != pExcept)
  135. delete pCache;
  136. }
  137. }
  138. AFX_MODULE_THREAD_STATE::AFX_MODULE_THREAD_STATE()
  139. {
  140. m_frameList.Construct(offsetof(CFrameWnd, m_pNextFrameWnd));
  141. // Note: it is only necessary to initialize non-zero data
  142. m_pfnNewHandler = &AfxNewHandler;
  143. }
  144. AFX_MODULE_THREAD_STATE::~AFX_MODULE_THREAD_STATE()
  145. {
  146. // cleanup temp/permanent maps (just the maps themselves)
  147. delete m_pmapHWND;
  148. delete m_pmapHMENU;
  149. delete m_pmapHDC;
  150. delete m_pmapHGDIOBJ;
  151. delete m_pmapHIMAGELIST;
  152. #ifndef _AFX_NO_SOCKET_SUPPORT
  153. // cleanup socket notification list
  154. if (m_plistSocketNotifications != NULL)
  155. while (!m_plistSocketNotifications->IsEmpty())
  156. delete m_plistSocketNotifications->RemoveHead();
  157. #ifndef _AFXDLL
  158. // cleanup dynamically allocated socket maps
  159. delete m_pmapSocketHandle;
  160. delete m_pmapDeadSockets;
  161. delete m_plistSocketNotifications;
  162. #endif
  163. #endif //!_AFX_NO_SOCKET_SUPPORT
  164. }
  165. /////////////////////////////////////////////////////////////////////////////
  166. // AFX_MODULE_STATE for base application
  167. LRESULT CALLBACK AfxWndProcBase(HWND, UINT, WPARAM, LPARAM);
  168. class _AFX_BASE_MODULE_STATE : public AFX_MODULE_STATE
  169. {
  170. public:
  171. #ifdef _AFXDLL
  172. _AFX_BASE_MODULE_STATE() : AFX_MODULE_STATE(TRUE, AfxWndProcBase, _MFC_VER)
  173. #else
  174. _AFX_BASE_MODULE_STATE() : AFX_MODULE_STATE(TRUE)
  175. #endif
  176. { }
  177. };
  178. PROCESS_LOCAL(_AFX_BASE_MODULE_STATE, _afxBaseModuleState)
  179. #ifdef _AFXDLL
  180. #undef AfxWndProc
  181. LRESULT CALLBACK
  182. AfxWndProcBase(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
  183. {
  184. AFX_MANAGE_STATE(_afxBaseModuleState.GetData());
  185. return AfxWndProc(hWnd, nMsg, wParam, lParam);
  186. }
  187. #endif
  188. /////////////////////////////////////////////////////////////////////////////
  189. // helper functions for module state
  190. AFX_MODULE_STATE* AFXAPI AfxGetAppModuleState()
  191. {
  192. return _afxBaseModuleState.GetData();
  193. }
  194. AFX_MODULE_STATE* AFXAPI AfxGetModuleState()
  195. {
  196. _AFX_THREAD_STATE* pState = _afxThreadState;
  197. AFX_MODULE_STATE* pResult;
  198. if (pState->m_pModuleState != NULL)
  199. {
  200. // thread state's module state serves as override
  201. pResult = pState->m_pModuleState;
  202. }
  203. else
  204. {
  205. // otherwise, use global app state
  206. pResult = _afxBaseModuleState.GetData();
  207. }
  208. ASSERT(pResult != NULL);
  209. return pResult;
  210. }
  211. AFX_MODULE_THREAD_STATE* AFXAPI AfxGetModuleThreadState()
  212. {
  213. return AfxGetModuleState()->m_thread.GetData();
  214. }
  215. /////////////////////////////////////////////////////////////////////////////
  216. // CTypeLibCache::Unlock
  217. // (Note: the rest of CTypeLibCache is implemented in oletyplb.cpp)
  218. /*void CTypeLibCache::Unlock()
  219. {
  220. ASSERT(m_cRef > 0);
  221. if (InterlockedDecrement(&m_cRef) == 0)
  222. {
  223. if (m_ptinfo != NULL)
  224. {
  225. m_ptinfo->Release();
  226. m_ptinfo = NULL;
  227. }
  228. if (m_ptlib != NULL)
  229. {
  230. m_ptlib->Release();
  231. m_ptlib = NULL;
  232. }
  233. }
  234. }*/