CWinApp::CWinApp(LPCTSTR lpszAppName)
{
if (lpszAppName != NULL)
/*开辟新空间,复制字符串*/
m_pszAppName = _tcsdup(lpszAppName);
else
m_pszAppName = NULL;
// initialize CWinThread state
// AFX_MOUDLE_STATE 当前程序模块状态信息
// 获取全局变量 的地址,其中 _AFX_CMDTARGET_GETSTATE是 AfxGetMoudleState()
AFX_MODULE_STATE* pModuleState = _AFX_CMDTARGET_GETSTATE();
ENSURE(pModuleState);
// AFX_MODULE_THREAD_STATE 当前程序线程状态信息,以下是从当前程序模块中获得当前程序线程状态
AFX_MODULE_THREAD_STATE* pThreadState = pModuleState->m_thread;
ENSURE(pThreadState);
/*AfxGetThread 获得是theApp的地址*/
ASSERT(AfxGetThread() == NULL);
// 将当前线程设置为 theApp
pThreadState->m_pCurrentWinThread = this;
//ASSERT(表达式) 表达式为真,继续执行,表达式为假中断了
ASSERT(AfxGetThread() == this);
// 给CWinApp 的成员m_hthread赋值, 即保存线程句柄
m_hThread = ::GetCurrentThread();
// 给CWinApp的成员GetCurrentThreadId 赋值,其意义为保存当前线程的的ID
m_nThreadID = ::GetCurrentThreadId();
// initialize CWinApp state
ASSERT(afxCurrentWinApp == NULL); // only one CWinApp object please
// 将theApp的地址存到程序模块中
pModuleState->m_pCurrentWinApp = this;
/*AfxGetApp, 返回的是TheApp的地址*/
ASSERT(AfxGetApp() == this);
// in non-running state until WinMain
/*应用程序实例句柄*/
m_hInstance = NULL;
m_hLangResourceDLL = NULL;
m_pszHelpFilePath = NULL;
m_pszProfileName = NULL;
/*注册键. */
m_pszRegistryKey = NULL;
m_pszExeName = NULL;
m_pszAppID = NULL;
m_pRecentFileList = NULL;
m_pDocManager = NULL;
m_atomApp = m_atomSystemTopic = NULL;
m_lpCmdLine = NULL;
m_pCmdInfo = NULL;
m_pDataRecoveryHandler = NULL;
// initialize wait cursor state
m_nWaitCursorCount = 0;
m_hcurWaitCursorRestore = NULL;
// initialize current printer state
m_hDevMode = NULL;
m_hDevNames = NULL;
m_nNumPreviewPages = 0; // not specified (defaults to 1)
// initialize DAO state
m_lpfnDaoTerm = NULL; // will be set if AfxDaoInit called
// other initialization
m_bHelpMode = FALSE;
m_eHelpType = afxWinHelp;
m_nSafetyPoolSize = 512; // default size
m_dwRestartManagerSupportFlags = 0; // don't support Restart Manager by default
m_nAutosaveInterval = 5 * 60 * 1000; // default autosave interval is 5 minutes (only has effect if autosave flag is set)
m_bTaskbarInteractionEnabled = TRUE;
// Detect the kind of OS:
OSVERSIONINFO osvi;
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
// Fix for warnings when building against WinBlue build 9444.0.130614-1739
// warning C4996: 'GetVersionExW': was declared deprecated
// externalapis\windows\winblue\sdk\inc\sysinfoapi.h(442)
// Deprecated. Use VerifyVersionInfo* or IsWindows* macros from VersionHelpers.
#pragma warning( disable : 4996 )
::GetVersionEx(&osvi);
#pragma warning( default : 4996 )
m_bIsWindows7 = (osvi.dwMajorVersion == 6) && (osvi.dwMinorVersion >= 1) || (osvi.dwMajorVersion > 6);
// Taskbar initialization:
m_bComInitialized = FALSE;
m_pTaskbarList = NULL;
m_pTaskbarList3 = NULL;
m_bTaskBarInterfacesAvailable = TRUE;
}
{
if (lpszAppName != NULL)
/*开辟新空间,复制字符串*/
m_pszAppName = _tcsdup(lpszAppName);
else
m_pszAppName = NULL;
// initialize CWinThread state
// AFX_MOUDLE_STATE 当前程序模块状态信息
// 获取全局变量 的地址,其中 _AFX_CMDTARGET_GETSTATE是 AfxGetMoudleState()
AFX_MODULE_STATE* pModuleState = _AFX_CMDTARGET_GETSTATE();
ENSURE(pModuleState);
// AFX_MODULE_THREAD_STATE 当前程序线程状态信息,以下是从当前程序模块中获得当前程序线程状态
AFX_MODULE_THREAD_STATE* pThreadState = pModuleState->m_thread;
ENSURE(pThreadState);
/*AfxGetThread 获得是theApp的地址*/
ASSERT(AfxGetThread() == NULL);
// 将当前线程设置为 theApp
pThreadState->m_pCurrentWinThread = this;
//ASSERT(表达式) 表达式为真,继续执行,表达式为假中断了
ASSERT(AfxGetThread() == this);
// 给CWinApp 的成员m_hthread赋值, 即保存线程句柄
m_hThread = ::GetCurrentThread();
// 给CWinApp的成员GetCurrentThreadId 赋值,其意义为保存当前线程的的ID
m_nThreadID = ::GetCurrentThreadId();
// initialize CWinApp state
ASSERT(afxCurrentWinApp == NULL); // only one CWinApp object please
// 将theApp的地址存到程序模块中
pModuleState->m_pCurrentWinApp = this;
/*AfxGetApp, 返回的是TheApp的地址*/
ASSERT(AfxGetApp() == this);
// in non-running state until WinMain
/*应用程序实例句柄*/
m_hInstance = NULL;
m_hLangResourceDLL = NULL;
m_pszHelpFilePath = NULL;
m_pszProfileName = NULL;
/*注册键. */
m_pszRegistryKey = NULL;
m_pszExeName = NULL;
m_pszAppID = NULL;
m_pRecentFileList = NULL;
m_pDocManager = NULL;
m_atomApp = m_atomSystemTopic = NULL;
m_lpCmdLine = NULL;
m_pCmdInfo = NULL;
m_pDataRecoveryHandler = NULL;
// initialize wait cursor state
m_nWaitCursorCount = 0;
m_hcurWaitCursorRestore = NULL;
// initialize current printer state
m_hDevMode = NULL;
m_hDevNames = NULL;
m_nNumPreviewPages = 0; // not specified (defaults to 1)
// initialize DAO state
m_lpfnDaoTerm = NULL; // will be set if AfxDaoInit called
// other initialization
m_bHelpMode = FALSE;
m_eHelpType = afxWinHelp;
m_nSafetyPoolSize = 512; // default size
m_dwRestartManagerSupportFlags = 0; // don't support Restart Manager by default
m_nAutosaveInterval = 5 * 60 * 1000; // default autosave interval is 5 minutes (only has effect if autosave flag is set)
m_bTaskbarInteractionEnabled = TRUE;
// Detect the kind of OS:
OSVERSIONINFO osvi;
osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
// Fix for warnings when building against WinBlue build 9444.0.130614-1739
// warning C4996: 'GetVersionExW': was declared deprecated
// externalapis\windows\winblue\sdk\inc\sysinfoapi.h(442)
// Deprecated. Use VerifyVersionInfo* or IsWindows* macros from VersionHelpers.
#pragma warning( disable : 4996 )
::GetVersionEx(&osvi);
#pragma warning( default : 4996 )
m_bIsWindows7 = (osvi.dwMajorVersion == 6) && (osvi.dwMinorVersion >= 1) || (osvi.dwMajorVersion > 6);
// Taskbar initialization:
m_bComInitialized = FALSE;
m_pTaskbarList = NULL;
m_pTaskbarList3 = NULL;
m_bTaskBarInterfacesAvailable = TRUE;
}