static CHandleMap* afxMapHGDIOBJ(BOOL bCreate) { AFX_MODULE_THREAD_STATE* pState = AfxGetModuleThreadState(); if (pState->m_pmapHGDIOBJ == NULL && bCreate) { BOOL bEnable = AfxEnableMemoryTracking(FALSE); #ifndef _AFX_PORTABLE _PNH pnhOldHandler = AfxSetNewHandler(&AfxCriticalNewHandler); #endif pState->m_pmapHGDIOBJ = new CHandleMap(RUNTIME_CLASS(CGdiObject), offsetof(CGdiObject, m_hObject)); #ifndef _AFX_PORTABLE AfxSetNewHandler(pnhOldHandler); #endif AfxEnableMemoryTracking(bEnable); } return pState->m_pmapHGDIOBJ; }
CHandleMap* PASCAL afxMapHDC(BOOL bCreate) { AFX_MODULE_THREAD_STATE* pState = AfxGetModuleThreadState(); if (pState->m_pmapHDC == NULL && bCreate) { BOOL bEnable = AfxEnableMemoryTracking(FALSE); #ifndef _AFX_PORTABLE _PNH pnhOldHandler = AfxSetNewHandler(&AfxCriticalNewHandler); #endif pState->m_pmapHDC = new CHandleMap(RUNTIME_CLASS(CDC), ConstructDestruct<CDC>::Construct, ConstructDestruct<CDC>::Destruct, offsetof(CDC, m_hDC), 2); #ifndef _AFX_PORTABLE AfxSetNewHandler(pnhOldHandler); #endif AfxEnableMemoryTracking(bEnable); } return pState->m_pmapHDC; }
inline NoThrowNew() throw() { AfxSetNewHandler( &NoThrowNew::OutOfMemoryHandler ); }
CObject* CHandleMap::FromHandle(HANDLE h) { ASSERT(m_pClass != NULL); ASSERT(m_nHandles == 1 || m_nHandles == 2); if (h == NULL) return NULL; CObject* pObject = LookupPermanent(h); if (pObject != NULL) return pObject; // return permanent one else if ((pObject = LookupTemporary(h)) != NULL) { HANDLE* ph = (HANDLE*)((BYTE*)pObject + m_nOffset); ASSERT(ph[0] == h || ph[0] == NULL); ph[0] = h; if (m_nHandles == 2) { ASSERT(ph[1] == h || ph[1] == NULL); ph[1] = h; } return pObject; // return current temporary one } // This handle wasn't created by us, so we must create a temporary // C++ object to wrap it. We don't want the user to see this memory // allocation, so we turn tracing off. BOOL bEnable = AfxEnableMemoryTracking(FALSE); #ifndef _AFX_PORTABLE _PNH pnhOldHandler = AfxSetNewHandler(&AfxCriticalNewHandler); #endif CObject* pTemp = NULL; TRY { pTemp = m_pClass->CreateObject(); if (pTemp == NULL) AfxThrowMemoryException(); m_temporaryMap.SetAt((LPVOID)h, pTemp); } CATCH_ALL(e) { #ifndef _AFX_PORTABLE AfxSetNewHandler(pnhOldHandler); #endif AfxEnableMemoryTracking(bEnable); THROW_LAST(); } END_CATCH_ALL #ifndef _AFX_PORTABLE AfxSetNewHandler(pnhOldHandler); #endif AfxEnableMemoryTracking(bEnable); // now set the handle in the object HANDLE* ph = (HANDLE*)((BYTE*)pTemp + m_nOffset); // after CObject ph[0] = h; if (m_nHandles == 2) ph[1] = h; return pTemp; }