@@ -23,7 +23,6 @@ extern _PVFV __xp_z[];
23
23
extern _PVFV __xt_a [];
24
24
extern _PVFV __xt_z [];
25
25
26
- extern int main (int , char * * , char * * );
27
26
extern void _setargv (void );
28
27
extern void term_atexit ();
29
28
@@ -78,7 +77,14 @@ __pragma(comment(linker, "/alternatename:_DllMain@12=___DefaultDllMain@12"));
78
77
#else // _APPTYPE != __UNKNOWN_APP
79
78
80
79
extern int __argc ;
80
+
81
+ #ifndef _UNICODE
81
82
extern char * * __argv ;
83
+ extern int main (int , char * * , char * * );
84
+ #else
85
+ extern wchar_t * * __wargv ;
86
+ extern int wmain (int , wchar_t * * , wchar_t * * );
87
+ #endif
82
88
83
89
#if MSVCRT_VERSION >= 140 // UCRT
84
90
@@ -95,10 +101,17 @@ enum _crt_argv_mode
95
101
_crt_argv_expanded_arguments ,
96
102
};
97
103
104
+ #ifndef _UNICODE
98
105
extern int _initialize_narrow_environment ();
99
106
extern char * * _get_initial_narrow_environment ();
100
107
extern int _configure_narrow_argv (int );
101
108
extern char * _get_narrow_winmain_command_line ();
109
+ #else // _UNICODE
110
+ extern int _initialize_wide_environment ();
111
+ extern wchar_t * * _get_initial_wide_environment ();
112
+ extern int _configure_wide_argv (int );
113
+ extern wchar_t * _get_wide_winmain_command_line ();
114
+ #endif
102
115
103
116
#else // MSVCRT_VERSION < 140
104
117
@@ -107,55 +120,91 @@ extern char *_get_narrow_winmain_command_line();
107
120
* it as a dummy, with a declared size of zero in its first and only field).
108
121
*/
109
122
typedef struct _startupinfo { int mode ; } _startupinfo ;
110
- extern void __getmainargs ( int * argc , char * * * argv , char * * * penv , int glob , _startupinfo * info );
111
-
123
+ #ifndef _UNICODE
124
+ extern int __getmainargs (int * argc , char * * * argv , char * * * penv , int glob , _startupinfo * info );
125
+ #else
126
+ extern int __wgetmainargs (int * argc , wchar_t * * * argv , wchar_t * * * penv , int glob , _startupinfo * info );
112
127
#endif
113
128
129
+ #endif // MSVCRT_VERSION < 140
130
+
114
131
/* The function mainCRTStartup() is the entry point for all
115
132
* console/desktop programs.
116
133
*/
117
134
#if _APPTYPE == __CONSOLE_APP
135
+ #ifndef _UNICODE
118
136
void mainCRTStartup (void )
119
- #else
137
+ #else
138
+ void wmainCRTStartup (void )
139
+ #endif
140
+ #else // desktop app
141
+ #ifndef _UNICODE
120
142
void WinMainCRTStartup (void )
143
+ #else
144
+ void wWinMainCRTStartup (void )
145
+ #endif
121
146
#endif
122
147
{
123
148
int nRet ;
124
149
__set_app_type (_APPTYPE );
125
150
__ref_oldnames = 0 ; // drag in alternate definitions
126
151
127
152
#if MSVCRT_VERSION >= 140 // UCRT
153
+ #ifndef _UNICODE
128
154
_configure_narrow_argv (_crt_argv_unexpanded_arguments );
129
155
_initialize_narrow_environment ();
130
156
char * * envp = _get_initial_narrow_environment ();
131
- #else
157
+ #else
158
+ _configure_wide_argv (_crt_argv_unexpanded_arguments );
159
+ _initialize_wide_environment ();
160
+ wchar_t * * wenvp = _get_initial_wide_environment ();
161
+ #endif
162
+ #else // MSVCRT_VERSION < 140
132
163
/* The MSVCRT.DLL start-up hook requires this invocation
133
164
* protocol...
134
165
*/
135
- char * * envp = NULL ;
136
166
_startupinfo start_info = { 0 };
167
+ #ifndef _UNICODE
168
+ char * * envp = NULL ;
137
169
__getmainargs (& __argc , & __argv , & envp , 0 , & start_info );
138
- #endif
170
+ #else
171
+ wchar_t * * wenvp = NULL ;
172
+ __wgetmainargs (& __argc , & __wargv , & wenvp , 0 , & start_info );
173
+ #endif
174
+ #endif // MSVCRT_VERSION < 140
139
175
140
176
_initterm_e (__xi_a , __xi_z );
141
177
_initterm (__xc_a , __xc_z );
142
178
143
179
#if _APPTYPE == __CONSOLE_APP
180
+ #ifndef _UNICODE
144
181
nRet = main (__argc , __argv , envp );
145
- #else
182
+ #else
183
+ nRet = wmain (__argc , __wargv , wenvp );
184
+ #endif
185
+ #else // desktop app
146
186
{
147
187
STARTUPINFOA startupInfo ;
148
188
GetStartupInfoA (& startupInfo );
149
189
int showWindowMode = startupInfo .dwFlags & STARTF_USESHOWWINDOW
150
190
? startupInfo .wShowWindow : SW_SHOWDEFAULT ;
151
- #if MSVCRT_VERSION >= 140 // UCRT
191
+ #ifndef _UNICODE
192
+ #if MSVCRT_VERSION >= 140 // UCRT
152
193
LPSTR lpszCommandLine = _get_narrow_winmain_command_line ();
153
- #else
194
+ #else
154
195
LPSTR lpszCommandLine = GetCommandLineA ();
155
- #endif
196
+ #endif
156
197
nRet = WinMain ((HINSTANCE )& __ImageBase , NULL , lpszCommandLine , showWindowMode );
198
+ #else // _UNICODE
199
+ #if MSVCRT_VERSION >= 140 // UCRT
200
+ LPWSTR lpszCommandLine = _get_wide_winmain_command_line ();
201
+ #else
202
+ LPWSTR lpszCommandLine = GetCommandLineW ();
203
+ #endif
204
+ nRet = wWinMain ((HINSTANCE )& __ImageBase , NULL , lpszCommandLine , showWindowMode );
205
+ #endif
157
206
}
158
- #endif
207
+ #endif // desktop app
159
208
160
209
term_atexit ();
161
210
_initterm (__xp_a , __xp_z );
0 commit comments