538 lines
14 KiB
C++
538 lines
14 KiB
C++
// This is a part of the Microsoft Foundation Classes C++ library.
|
|
// Copyright (C) 1992 Microsoft Corporation
|
|
// All rights reserved.
|
|
//
|
|
// This source code is only intended as a supplement to the
|
|
// Microsoft Foundation Classes Reference and Microsoft
|
|
// QuickHelp and/or WinHelp documentation provided with the library.
|
|
// See these sources for detailed information regarding the
|
|
// Microsoft Foundation Classes product.
|
|
|
|
#ifndef __AFXSTATE_H__
|
|
#define __AFXSTATE_H__
|
|
|
|
#ifdef _AFX_PACKING
|
|
#pragma pack(push, _AFX_PACKING)
|
|
#endif
|
|
|
|
#undef AFX_DATA
|
|
#define AFX_DATA AFX_CORE_DATA
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Application global state
|
|
|
|
class CWinApp;
|
|
class COleObjectFactory;
|
|
class CDynLinkLibrary;
|
|
|
|
struct AFX_CORE_STATE
|
|
{
|
|
// Implementation
|
|
public:
|
|
CWinApp* m_pCurrentWinApp;
|
|
HINSTANCE m_hCurrentInstanceHandle;
|
|
HINSTANCE m_hCurrentResourceHandle;
|
|
LPCTSTR m_lpszCurrentAppName;
|
|
|
|
// instance specific lists
|
|
CRuntimeClass* m_pFirstClass;
|
|
|
|
// exceptions
|
|
AFX_TERM_PROC m_pfnTerminate;
|
|
|
|
#ifdef _AFXDLL
|
|
CDynLinkLibrary* m_pFirstDLL; // start of DLL list
|
|
HINSTANCE m_appLangDLL;
|
|
#endif
|
|
|
|
public:
|
|
AFX_CORE_STATE();
|
|
};
|
|
|
|
#if defined(_AFXDLL) || defined(_AFXCTL)
|
|
#define AfxGetCoreState() (&AfxGetAppState()->m_coreState)
|
|
#else
|
|
extern AFX_DATA AFX_CORE_STATE _afxCoreState;
|
|
#define AfxGetCoreState() (&_afxCoreState)
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// AFX_WIN_STATE
|
|
|
|
class CView;
|
|
class CFrameWnd;
|
|
|
|
struct AFX_WIN_STATE
|
|
{
|
|
// Implementation
|
|
public:
|
|
// custom colors are held here and saved between calls
|
|
COLORREF m_crSavedCustom[16];
|
|
|
|
// gray dialog support
|
|
HBRUSH m_hDlgBkBrush; // dialog and message box background brush
|
|
COLORREF m_crDlgTextClr;
|
|
#ifdef _MAC
|
|
COLORREF m_crDlgBkClr;
|
|
#endif
|
|
|
|
#if !defined(_MAC) && !defined(_USRDLL) && !defined(_AFXCTL)
|
|
// 3d controls support
|
|
BOOL m_bCtl3dInited;
|
|
HINSTANCE m_hCtl3dLib;
|
|
BOOL (WINAPI* m_pfnRegister)(HINSTANCE);
|
|
BOOL (WINAPI* m_pfnUnregister)(HINSTANCE);
|
|
BOOL (WINAPI* m_pfnAutoSubclass)(HINSTANCE);
|
|
BOOL (WINAPI* m_pfnUnAutoSubclass)();
|
|
BOOL (WINAPI* m_pfnColorChange)();
|
|
BOOL (WINAPI* m_pfnSubclassDlgEx)(HWND, DWORD);
|
|
void (WINAPI* m_pfnWinIniChange)();
|
|
BOOL (WINAPI* m_pfnSubclassCtl)(HWND);
|
|
BOOL (WINAPI* m_pfnSubclassCtlEx)(HWND, int);
|
|
#endif
|
|
|
|
// printing abort
|
|
BOOL m_bUserAbort;
|
|
|
|
// pen support
|
|
void (CALLBACK* m_pfnRegisterPenAppProc)(UINT, BOOL);
|
|
|
|
// application shutdown behavior
|
|
DWORD m_nObjectCount;
|
|
BOOL m_bUserCtrl;
|
|
|
|
#if defined(_USRDLL) || defined(_AFXCTL)
|
|
TCHAR m_szUnregisterList[4096]; // per-process AfxRegisterClass data
|
|
#endif
|
|
|
|
public:
|
|
AFX_WIN_STATE();
|
|
~AFX_WIN_STATE();
|
|
};
|
|
|
|
#if defined(_AFXDLL) || defined(_AFXCTL)
|
|
#define AfxGetWinState() (&AfxGetAppState()->m_winState)
|
|
#else
|
|
extern AFX_DATA AFX_WIN_STATE _afxWinState;
|
|
#define AfxGetWinState() (&_afxWinState)
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// AFX_EDIT_STATE : last find/replace state
|
|
|
|
class CFindReplaceDialog;
|
|
|
|
struct AFX_EDIT_STATE
|
|
{
|
|
CFindReplaceDialog* pFindReplaceDlg; // find or replace dialog
|
|
BOOL bFindOnly; // Is pFindReplace the find or replace?
|
|
CString strFind; // last find string
|
|
CString strReplace; // last replace string
|
|
BOOL bCase; // TRUE==case sensitive, FALSE==not
|
|
int bNext; // TRUE==search down, FALSE== search up
|
|
|
|
AFX_EDIT_STATE();
|
|
~AFX_EDIT_STATE();
|
|
};
|
|
|
|
|
|
#if defined(_WINDLL) || defined(_AFXDLL)
|
|
#define AfxGetEditState() (&AfxGetAppState()->m_editState)
|
|
#else
|
|
extern AFX_DATA AFX_EDIT_STATE _afxEditState;
|
|
#define AfxGetEditState() (&_afxEditState)
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// AFX_OLE_STATE
|
|
|
|
#undef AFX_DATA
|
|
#define AFX_DATA AFX_OLE_DATA
|
|
|
|
class COleDataSource;
|
|
|
|
struct AFX_OLE_STATE
|
|
{
|
|
// Implementation
|
|
public:
|
|
COleObjectFactory* m_pFirstFactory;
|
|
|
|
BOOL m_bNeedTerm;
|
|
BOOL m_bNeedTermCOM;
|
|
|
|
CView* m_pActivateView; // activation view
|
|
COleDataSource* m_pClipboardSource;
|
|
|
|
public:
|
|
AFX_OLE_STATE();
|
|
};
|
|
|
|
#if defined(_AFXDLL) || defined(_AFXCTL)
|
|
#define AfxGetOleState() (&AfxGetAppState()->m_oleState)
|
|
#else
|
|
extern AFX_DATA AFX_OLE_STATE _afxOleState;
|
|
#define AfxGetOleState() (&_afxOleState)
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// AFX_DB_STATE
|
|
|
|
#undef AFX_DATA
|
|
#define AFX_DATA AFX_DB_DATA
|
|
|
|
typedef void* HENV; // must match SQL.H
|
|
|
|
struct AFX_DB_STATE
|
|
{
|
|
// Implementation
|
|
public:
|
|
// MFC/DB global data
|
|
HENV m_henvAllConnections; // per-app HENV (CDatabase)
|
|
int m_nAllocatedConnections; // per-app reference to HENV above
|
|
|
|
public:
|
|
AFX_DB_STATE();
|
|
};
|
|
|
|
#if defined(_WINDLL) || defined(_AFXDLL)
|
|
#define AfxGetDbState() (&AfxGetAppState()->m_dbState)
|
|
#else
|
|
extern AFX_DATA AFX_DB_STATE _afxDbState;
|
|
#define AfxGetDbState() (&_afxDbState)
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// AFX_MAIL_STATE
|
|
|
|
struct AFX_MAIL_STATE
|
|
{
|
|
// Implementation
|
|
public:
|
|
HINSTANCE m_hInstMail; // handle to MAPI32.DLL
|
|
|
|
public:
|
|
~AFX_MAIL_STATE();
|
|
};
|
|
|
|
#if defined(_WINDLL) || defined(_AFXDLL)
|
|
#define AfxGetMailState() (&AfxGetAppState()->m_mailState)
|
|
#else
|
|
extern AFX_DATA AFX_MAIL_STATE _afxMailState;
|
|
#define AfxGetMailState() (&_afxMailState)
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// AFX_SOCK_STATE
|
|
|
|
struct AFX_SOCK_STATE
|
|
{
|
|
// Implementation
|
|
public:
|
|
void (*m_lpfnCleanup)();
|
|
|
|
public:
|
|
~AFX_SOCK_STATE();
|
|
};
|
|
|
|
#if defined(_WINDLL) || defined(_AFXDLL)
|
|
#define AfxGetSockState() (&AfxGetAppState()->m_sockState)
|
|
#else
|
|
extern AFX_DATA AFX_SOCK_STATE _afxSockState;
|
|
#define AfxGetSockState() (&_afxSockState)
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// AFX_ALLOC_STATE
|
|
|
|
struct IMalloc; // must match OBJBASE.H
|
|
typedef IMalloc* LPMALLOC;
|
|
|
|
struct AFX_ALLOC_STATE
|
|
{
|
|
// Implementation
|
|
public:
|
|
LPMALLOC m_lpTaskMalloc; // OLE task allocator.
|
|
|
|
#ifdef _DEBUG
|
|
// options for tuning the allocation diagnostics
|
|
CDumpContext m_afxDump;
|
|
BOOL m_bTraceEnabled;
|
|
int m_nTraceFlags;
|
|
#if defined(_USRDLL) || defined(_AFXDLL)
|
|
int m_nMemDF; // a global variable with static linking
|
|
#endif
|
|
|
|
// memory diagnostics state
|
|
LONG m_lTotalAlloc; // total bytes of memory allocated
|
|
LONG m_lCurAlloc; // current bytes of memory allocated
|
|
LONG m_lMaxAlloc; // maximum bytes of memory allocated at any one time
|
|
|
|
CBlockHeader* m_pFirstBlock; // add in reverse order
|
|
BOOL (AFXAPI *m_lpfnAssertFailedLine)(LPCSTR, int);
|
|
#endif
|
|
|
|
public:
|
|
AFX_ALLOC_STATE();
|
|
};
|
|
|
|
#if defined(_WINDLL) || defined(_AFXDLL)
|
|
#define AfxGetAllocState() (&AfxGetAppState()->m_allocState)
|
|
#else
|
|
extern AFX_DATA AFX_ALLOC_STATE _afxAllocState;
|
|
#define AfxGetAllocState() (&_afxAllocState)
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// AFX_APP_STATE (only used for DLL versions)
|
|
|
|
#undef AFX_DATA
|
|
#define AFX_DATA AFX_CORE_DATA
|
|
|
|
#if defined(_WINDLL) || defined(_AFXDLL)
|
|
|
|
struct AFX_MODULE_STATE
|
|
{
|
|
// Implementation
|
|
public:
|
|
#ifdef _AFXCTL
|
|
AFX_MODULE_STATE* m_pID; // Uniquely identify where this data came from.
|
|
#endif
|
|
#if defined(_AFXDLL) || defined(_AFXCTL)
|
|
AFX_CORE_STATE m_coreState;
|
|
AFX_WIN_STATE m_winState;
|
|
AFX_OLE_STATE m_oleState;
|
|
|
|
public:
|
|
AFX_MODULE_STATE();
|
|
~AFX_MODULE_STATE();
|
|
#endif
|
|
|
|
#ifdef _AFXCTL
|
|
public:
|
|
void* operator new(size_t nSize);
|
|
void operator delete(void* p);
|
|
#endif
|
|
};
|
|
|
|
struct AFX_APP_STATE : AFX_MODULE_STATE
|
|
{
|
|
// Implementation
|
|
public:
|
|
AFX_DB_STATE m_dbState;
|
|
AFX_ALLOC_STATE m_allocState;
|
|
AFX_EDIT_STATE m_editState;
|
|
AFX_MAIL_STATE m_mailState;
|
|
AFX_SOCK_STATE m_sockState;
|
|
|
|
#ifdef _AFXCTL
|
|
CMapPtrToPtr m_mapExtraData; // Extra data for OLE controls.
|
|
#endif
|
|
|
|
void* AFX_CDECL operator new(size_t nSize);
|
|
void AFX_CDECL operator delete(void* p);
|
|
|
|
public:
|
|
AFX_APP_STATE();
|
|
~AFX_APP_STATE();
|
|
};
|
|
|
|
AFX_APP_STATE* AFXAPI AfxGetAppState();
|
|
|
|
#ifdef _AFXCTL
|
|
#define AfxGetExtraDataMap() (&AfxGetAppState()->m_mapExtraData)
|
|
|
|
AFX_MODULE_STATE* AFXAPI AfxGetBaseModuleContext();
|
|
AFX_MODULE_STATE* AFXAPI AfxGetCurrentModuleContext();
|
|
|
|
#define _afxModuleAddrCurrent AfxGetCurrentModuleContext()
|
|
|
|
#define AFX_MANAGE_STATE(pData) AFX_MAINTAIN_STATE _ctlState(pData);
|
|
|
|
#define METHOD_MANAGE_STATE(theClass, localClass) \
|
|
METHOD_PROLOGUE_EX(theClass, localClass) \
|
|
AFX_MANAGE_STATE(pThis->m_pModuleState)
|
|
|
|
extern AFX_MODULE_STATE* AFXAPI AfxPushModuleContext(AFX_MODULE_STATE* psIn);
|
|
extern void AFXAPI AfxPopModuleContext(AFX_MODULE_STATE* psIn,
|
|
BOOL bCopy = FALSE);
|
|
|
|
// When using this object, or the macros above that use this object
|
|
// it is necessary to insure that the object's destructor cannot be
|
|
// thrown past, by an unexpected exception.
|
|
|
|
class AFX_MAINTAIN_STATE
|
|
{
|
|
private:
|
|
AFX_MODULE_STATE* m_psPrevious;
|
|
|
|
public:
|
|
AFX_MAINTAIN_STATE(AFX_MODULE_STATE* psData);
|
|
~AFX_MAINTAIN_STATE();
|
|
};
|
|
#endif //_AFXCTL
|
|
|
|
#endif //_WINDLL || _AFXDLL
|
|
|
|
// Stub special OLE Control macros
|
|
#ifndef _AFXCTL
|
|
#define AFX_MANAGE_CTL_STATE()
|
|
#define METHOD_MANAGE_STATE(theClass, localClass) \
|
|
METHOD_PROLOGUE_EX(theClass, localClass)
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CHandleMap (needed for AFX_THREAD_STATE)
|
|
|
|
// Note: Do not access the members of this class directly.
|
|
// Use CWnd::FromHandle, CDC::FromHandle, etc.
|
|
// The actual definition is only included because it is
|
|
// necessary for the definition of CWinThread.
|
|
//
|
|
// Most Windows objects are represented with a HANDLE, including
|
|
// the most important ones, HWND, HDC, HPEN, HFONT etc.
|
|
// We want C++ objects to wrap these handle based objects whenever we can.
|
|
// Since Windows objects can be created outside of C++ (eg: calling
|
|
// ::CreateWindow will return an HWND with no C++ wrapper) we must
|
|
// support a reasonably uniform mapping from permanent handles
|
|
// (i.e. the ones allocated in C++) and temporary handles (i.e.
|
|
// the ones allocated in C, but passed through a C++ interface.
|
|
// We keep two dictionaries for this purpose. The permanent dictionary
|
|
// stores those C++ objects that have been explicitly created by
|
|
// the developer. The C++ constructor for the wrapper class will
|
|
// insert the mapping into the permanent dictionary and the C++
|
|
// destructor will remove it and possibly free up the associated
|
|
// Windows object.
|
|
// When a handle passes through a C++ interface that doesn't exist in
|
|
// the permanent dictionary, we allocate a temporary wrapping object
|
|
// and store that mapping into the temporary dictionary.
|
|
// At idle time the temporary wrapping objects are flushed (since you better
|
|
// not be holding onto something you didn't create).
|
|
//
|
|
|
|
class CWinThread; // forward reference for friend declaration
|
|
|
|
class CHandleMap
|
|
{
|
|
private: // implementation
|
|
CMapPtrToPtr m_permanentMap;
|
|
CMapPtrToPtr m_temporaryMap;
|
|
CRuntimeClass* m_pClass;
|
|
size_t m_nOffset; // offset of handles in the object
|
|
int m_nHandles; // 1 or 2 (for CDC)
|
|
|
|
// Constructors
|
|
public:
|
|
CHandleMap(CRuntimeClass* pClass, size_t nOffset, int nHandles = 1);
|
|
|
|
// Operations
|
|
public:
|
|
CObject* FromHandle(HANDLE h);
|
|
void DeleteTemp();
|
|
|
|
void SetPermanent(HANDLE h, CObject* permOb);
|
|
void RemoveHandle(HANDLE h);
|
|
|
|
BOOL LookupPermanent(HANDLE h, CObject*& pObject);
|
|
BOOL LookupTemporary(HANDLE h, CObject*& pObject);
|
|
|
|
friend class CWinThread;
|
|
};
|
|
|
|
// Note: out-of-line _DEBUG version is in winhand.cpp
|
|
#ifndef _DEBUG
|
|
inline void CHandleMap::SetPermanent(HANDLE h, CObject* permOb)
|
|
{ m_permanentMap[(LPVOID)h] = permOb; }
|
|
#endif
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Thread global state
|
|
|
|
class CWinThread; // forward reference (see afxwin.h)
|
|
class CWnd; // forward reference (see afxwin.h)
|
|
|
|
struct AFX_THREAD_STATE
|
|
{
|
|
// Implementation
|
|
public:
|
|
// current CWinThread pointer
|
|
CWinThread* m_pCurrentWinThread;
|
|
BOOL m_bInMsgFilter;
|
|
|
|
// list of CFrameWnds for thread
|
|
CFrameWnd* m_pFirstFrameWnd;
|
|
|
|
// memory safety pool for temp maps
|
|
void* m_pSafetyPoolBuffer; // current buffer
|
|
|
|
// thread local exception context
|
|
AFX_EXCEPTION_CONTEXT m_exceptionContext;
|
|
|
|
// temp map state
|
|
DWORD m_nTempMapLock; // if not 0, temp maps locked
|
|
CHandleMap* m_pmapHWND;
|
|
CHandleMap* m_pmapHMENU;
|
|
CHandleMap* m_pmapHDC;
|
|
CHandleMap* m_pmapHGDIOBJ;
|
|
|
|
// CWnd create and gray dialog hook
|
|
CWnd* m_pWndInit;
|
|
HWND m_hWndInit;
|
|
BOOL m_bDlgCreate;
|
|
HHOOK m_hHookOldSendMsg;
|
|
HHOOK m_hHookOldCbtFilter;
|
|
|
|
// other CWnd modal data
|
|
MSG m_lastSentMsg; // see CWnd::WindowProc
|
|
HWND m_hTrackingWindow; // see CWnd::TrackPopupMenu
|
|
HMENU m_hTrackingMenu;
|
|
TCHAR m_szTempClassName[64]; // see AfxRegisterWndClass
|
|
HWND m_hLockoutNotifyWindow; // see CWnd::OnCommand
|
|
|
|
// other framework modal data
|
|
CView* m_pRoutingView; // see CCmdTarget::GetRoutingView
|
|
|
|
// MFC/DB thread-local data
|
|
BOOL m_bWaitForDataSource;
|
|
|
|
#ifndef _AFXCTL
|
|
#ifndef _USRDLL
|
|
HHOOK m_hHookOldMsgFilter;
|
|
#endif
|
|
#endif
|
|
|
|
// WinSock specific thread state
|
|
HWND m_hSocketWindow;
|
|
CMapPtrToPtr m_mapSocketHandle;
|
|
CMapPtrToPtr m_mapDeadSockets;
|
|
CPtrList m_listSocketNotifications;
|
|
|
|
// common controls thread state
|
|
CHandleMap* m_pmapHIMAGELIST;
|
|
|
|
void* AFX_CDECL operator new(size_t nSize);
|
|
#ifdef _DEBUG
|
|
void* AFX_CDECL operator new(size_t nSize, LPCSTR lpszFileName, int nLine);
|
|
#endif
|
|
|
|
void AFX_CDECL operator delete(void* p);
|
|
|
|
public:
|
|
AFX_THREAD_STATE();
|
|
~AFX_THREAD_STATE();
|
|
};
|
|
|
|
AFX_THREAD_STATE* AFXAPI AfxGetThreadState();
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifdef _AFX_PACKING
|
|
#pragma pack(pop)
|
|
#endif
|
|
|
|
#undef AFX_DATA
|
|
#define AFX_DATA
|
|
|
|
#endif //__AFXSTATE_H__
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|