home *** CD-ROM | disk | FTP | other *** search
/ Supercompiler 1997 / SUPERCOMPILER97.iso / MS_VC.50 / VC / MFC / SRC / AFXSTATE.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1996-10-30  |  6.3 KB  |  261 lines

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