| 发表于:2007-04-25 13:43:165楼 得分:10 |
int wmaincrtstartup( #else /* wprflag */ int maincrtstartup( #endif /* wprflag */ #endif /* _winmain_ */ void ) { int initret; int mainret; osversioninfoa *posvi; int managedapp; #ifdef _winmain_ _tuchar *lpszcommandline; startupinfo startupinfo; #endif /* _winmain_ */ /* * dynamically allocate the osversioninfoa buffer, so we avoid * triggering the /gs buffer overrun detection. that can 't be * used here, since the guard cookie isn 't available until we * initialize it from here! */ posvi = (osversioninfoa *)_alloca(sizeof(osversioninfoa)); /* * get the full win32 version */ posvi-> dwosversioninfosize = sizeof(osversioninfoa); (void)getversionexa(posvi); _osplatform = posvi-> dwplatformid; _winmajor = posvi-> dwmajorversion; _winminor = posvi-> dwminorversion; /* * the somewhat bizarre calculations of _osver and _winver are * required for backward compatibility (used to use getversion) */ _osver = (posvi-> dwbuildnumber) & 0x07fff; if ( _osplatform != ver_platform_win32_nt ) _osver ¦= 0x08000; _winver = (_winmajor < < 8) + _winminor; /* * determine if this is a managed application */ managedapp = check_managed_app(); #ifdef _mt if ( !_heap_init(1) ) /* initialize heap */ #else /* _mt */ if ( !_heap_init(0) ) /* initialize heap */ #endif /* _mt */ fast_error_exit(_rt_heapinit); /* write message and die */ #ifdef _mt if( !_mtinit() ) /* initialize multi-thread */ fast_error_exit(_rt_thread); /* write message and die */ #endif /* _mt */ /* * initialize the runtime checks stuff */ #ifdef _rtc _rtc_initialize(); #endif /* _rtc */ /* * guard the remainder of the initialization code and the call * to user 's main, or winmain, function in a __try/__except * statement. */ __try { if ( _ioinit() < 0 ) /* initialize lowio */ _amsg_exit(_rt_lowioinit); #ifdef wprflag /* get wide cmd line info */ _wcmdln = (wchar_t *)__crtgetcommandlinew(); /* get wide environ info */ _wenvptr = (wchar_t *)__crtgetenvironmentstringsw(); if ( _wsetargv() < 0 ) _amsg_exit(_rt_spacearg); if ( _wsetenvp() < 0 ) _amsg_exit(_rt_spaceenv); #else /* wprflag */ /* get cmd line info */ _acmdln = (char *)getcommandlinea(); /* get environ info */ _aenvptr = (char *)__crtgetenvironmentstringsa(); if ( _setargv() < 0 ) _amsg_exit(_rt_spacearg); if ( _setenvp() < 0 ) _amsg_exit(_rt_spaceenv); #endif /* wprflag */ initret = _cinit(true); /* do c data initialize */ if (initret != 0) _amsg_exit(initret); #ifdef _winmain_ startupinfo.dwflags = 0; getstartupinfo( &startupinfo ); #ifdef wprflag lpszcommandline = _wwincmdln(); mainret = wwinmain( #else /* wprflag */ lpszcommandline = _wincmdln(); mainret = winmain( #endif /* wprflag */ getmodulehandlea(null), null, lpszcommandline, startupinfo.dwflags & startf_useshowwindow ? startupinfo.wshowwindow : sw_showdefault ); #else /* _winmain_ */ #ifdef wprflag __winitenv = _wenviron; mainret = wmain(__argc, __wargv, _wenviron); #else /* wprflag */ __initenv = _environ; mainret = main(__argc, __argv, _environ); #endif /* wprflag */ #endif /* _winmain_ */ if ( !managedapp ) exit(mainret); _cexit(); } __except ( _xcptfilter(getexceptioncode(), getexceptioninformation()) ) { /* * should never reach here */ mainret = getexceptioncode(); if ( !managedapp ) _exit(mainret); _c_exit(); } /* end of try - except */ return mainret; } vc里直接跟踪一下就出来了 | | |
|