📄 mcrtexe.cpp
字号:
/***
*crtexe.c - Initialization for console EXE using CRT DLL
*
* Copyright (c) Microsoft Corporation. All rights reserved.
*
*Purpose:
* This is the actual startup routine for apps linking to the CRT DLL.
* It calls the user's main routine [w]main() or [w]WinMain after
* performing C Run-Time Library initialization.
*
* With ifdefs, this source file also provides the source code for:
* wcrtexe.c the startup routine for console apps with wide chars
* crtexew.c the startup routine for Windows apps
* wcrtexew.c the startup routine for Windows apps with wide chars
*
*******************************************************************************/
#ifdef MRTDLL
#using <mscorlib.dll>
/*
* SPECIAL BUILD MACROS! Note that crtexe.c (and crtexew.c) is linked in with
* the client's code. It does not go into crtdll.dll! Therefore, it must be
* built under the _DLL switch (like user code) and MRTDLL must be undefined.
* The symbol SPECIAL_CRTEXE is turned on to suppress the normal CRT DLL
* definition of _fmode and _commode using __declspec(dllexport). Otherwise
* this module would not be able to refer to both the local and DLL versions
* of these two variables.
*/
#undef MRTDLL
#ifndef _DLL
#define _DLL
#endif /* _DLL */
#define SPECIAL_CRTEXE
#include <cruntime.h>
#include <oscalls.h>
#include <internal.h>
#include <process.h>
#include <math.h>
#include <rterr.h>
#include <stdlib.h>
#include <tchar.h>
#include <sect_attribs.h>
#include <stddef.h>
#include <locale.h>
#include <dbgint.h>
#include <new.h>
#include <rtcapi.h>
#pragma warning(disable:4439) // C4439: function with a managed parameter must have a __clrcall calling convention
/*
* Pointers to beginning and end of the table of function pointers manipulated
* by _onexit()/atexit(). The atexit/_onexit code is shared for both EXE's and
* DLL's but different behavior is required. These values are set to -1 to
* mark this module as an EXE.
* NOTE - the pointers are stored encoded.
*/
#if defined (_M_CEE_MIXED)
extern "C"
{
extern _PVFV *__onexitbegin;
extern _PVFV *__onexitend;
#ifdef _M_IX86
/*
* Declare/define communal to disable heap termination on corruption
*/
int _NoHeapEnableTerminationOnCorruption;
#endif /* _M_IX86 */
}
#pragma managed(push, off)
static int __cdecl _mixed_pre_c_init(void);
_CRTALLOC(".CRT$XIAA") static _PIFV mixed_pcinit = _mixed_pre_c_init;
#pragma managed(pop)
#endif /* defined (_M_CEE_MIXED) */
#define SPACECHAR _T(' ')
#define DQUOTECHAR _T('\"')
#if !defined (_MANAGED_MAIN)
#if defined (UNICODE)
extern "C" int __CxxPureMSILEntry(int, wchar_t **, wchar_t **);
#define __tinit_cmdline __winit_cmdline
#else /* defined (UNICODE) */
extern "C" int __CxxPureMSILEntry(int, char **, char **);
#define __tinit_cmdline __init_cmdline
#endif /* defined (UNICODE) */
using System::String;
using System::Int32;
static int __clrcall __tinit_cmdline(cli::array<String^> ^arguments);
#else /* !defined (_MANAGED_MAIN) */
using System::String;
using System::Int32;
int __clrcall main(cli::array<String^>^);
static void __clrcall __set_managed_app_type(void);
#endif /* !defined (_MANAGED_MAIN) */
static void __CLRCALL_OR_CDECL _common_init();
/*
* Declare the names of the exports corresponding to _fmode and _commode
*/
#define _IMP___FMODE (__p__fmode())
#define _IMP___COMMODE (__p__commode())
#if defined (WPRFLAG)
#define _IMP___WCMDLN (__p__wcmdln())
#else /* defined (WPRFLAG) */
#define _IMP___ACMDLN (__p__acmdln())
#endif /* defined (WPRFLAG) */
#if !defined (_M_IX86)
extern "C"
{
_CRTIMP int* (__cdecl __p__fmode)();
_CRTIMP int* (__cdecl __p__commode)();
}
#endif /* !defined (_M_IX86) */
extern int _fmode; /* must match the definition in <stdlib.h> */
extern int _commode; /* must match the definition in <internal.h> */
extern int _dowildcard; /* passed to __getmainargs() */
/*
* Declare/define communal that serves as indicator the default matherr
* routine is being used.
*/
extern "C"
{
extern int __defaultmatherr;
/*
* Declare function used to install a user-supplied _matherr routine.
*/
_CRTIMP void __setusermatherr( int (__cdecl *)(struct _exception *) );
}
#if defined (_M_CEE_MIXED)
#pragma managed(push, off)
/***
*_mixed_pre_c_init(void)
*
*Purpose:
* The code in mainCRTStartup that was executed before executing C
* initializers was shifted in this function. Also this funciton is the
* first thing that is executed in c init section.
*
*Entry:
*
*Exit:
*
*******************************************************************************/
#pragma warning(disable : 4792)
static int __cdecl _mixed_pre_c_init(void)
{
/*
* Mark this module as an EXE file so that atexit/_onexit
* will do the right thing when called, including for C++
* d-tors.
*/
__onexitbegin = __onexitend = (_PVFV *) EncodePointer((_PVFV *)(-1));
if ( !__defaultmatherr )
__setusermatherr(_matherr);
/*
* Run the RTC initialization code
*/
#ifdef _RTC
_RTC_Initialize();
#endif /* _RTC */
_common_init();
return 0;
}
#pragma managed(pop)
#endif /* defined (_M_CEE_MIXED) */
/***
*mainCRTStartup(void)
*wmainCRTStartup(void)
*WinMainCRTStartup(void)
*wWinMainCRTStartup(void)
*
*Purpose:
* These routines do the C runtime initialization, call the appropriate
* user entry function, and handle termination cleanup. For a managed
* app, they then return the exit code back to the calling routine, which
* is the managed startup code. For an unmanaged app, they call exit and
* never return.
*
* Function: User entry called:
* mainCRTStartup main
* wmainCRTStartup wmain
* WinMainCRTStartup WinMain
* wWinMainCRTStartup wWinMain
*
*Entry:
*
*Exit:
* Managed app: return value from main() et al, or the exception code if
* execution was terminated by the __except guarding the call
* to main().
* Unmanaged app: never return.
*
*******************************************************************************/
#if !defined (_MANAGED_MAIN)
#ifdef _WINMAIN_
#ifdef WPRFLAG
#define _mainCRTStartup wWinMainCRTStartup
#else /* WPRFLAG */
#define _mainCRTStartup WinMainCRTStartup
#endif /* WPRFLAG */
#else /* _WINMAIN_ */
#ifdef WPRFLAG
#define _mainCRTStartup wmainCRTStartup
#else /* WPRFLAG */
#define _mainCRTStartup mainCRTStartup
#endif /* WPRFLAG */
#endif /* _WINMAIN_ */
#else /* !defined (_MANAGED_MAIN) */
#define _mainCRTStartup __clrcall mainCRTStartupStrArray
#endif /* !defined (_MANAGED_MAIN) */
#if !defined (_MANAGED_MAIN) && defined (_WINMAIN_)
int _mainCRTStartup(void)
#else /* !defined (_MANAGED_MAIN) && defined (_WINMAIN_) */
int _mainCRTStartup(array<String^>^ arguments)
#endif /* !defined (_MANAGED_MAIN) && defined (_WINMAIN_) */
{
int argc; /* three standard arguments to main */
_TCHAR **argv;
_TCHAR **envp;
int argret;
int mainret;
_startupinfo startinfo;
#ifdef _WINMAIN_
_TCHAR *lpszCommandLine;
BOOL inDoubleQuote=FALSE;
STARTUPINFOW __startup_info;
GetStartupInfoW(&__startup_info);
#endif /* _WINMAIN_ */
#if defined (_M_CEE_MIXED) && defined (_M_IX86)
/*
* Enable app termination when heap corruption is detected on
* Windows Vista and above. This is a no-op on down-level OS's
* and enabled by default for 64-bit processes.
*/
if (!_NoHeapEnableTerminationOnCorruption)
{
HeapSetInformation(NULL, HeapEnableTerminationOnCorruption, NULL, 0);
}
#endif /* defined (_M_CEE_MIXED) && defined (_M_IX86) */
/*
* Guard the initialization code and the call to user's main, or
* WinMain, function in a __try/__except statement.
*/
__try {
#if defined (_M_CEE_PURE)
_common_init();
#endif /* defined (_M_CEE_PURE) */
/*
* Call _setargv(), which will trigger a call to __setargv() if
* SETARGV.OBJ is linked with the EXE. If SETARGV.OBJ is not
* linked with the EXE, a dummy _setargv() will be called.
*/
#ifdef WPRFLAG
_wsetargv();
#else /* WPRFLAG */
_setargv();
#endif /* WPRFLAG */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -