唯一的区别是Winmain为lpCmdLine参数取char *,而wWinMain取wchar_t *。
在Windows XP上,如果应用程序条目是WinMain,Windows是否会将命令行从Unicode转换为Ansi并传递给应用程序?
如果命令行参数必须是Unicode(例如,Unicode文件名,转换会导致某些字符丢失),这是否意味着我必须使用wWinMain作为输入函数?
答案 0 :(得分:13)
在Windows XP上,如果应用程序条目是WinMain,Windows是否会将命令行从Unicode转换为Ansi并传递给应用程序?
是
如果命令行参数必须是Unicode(例如,Unicode文件名,转换会导致某些字符丢失),这是否意味着我必须使用wWinMain作为输入函数?
是的,如果你想正确处理程序的Unicode参数,你应该这样做。
WinMain() on MSDN的文件也同意。
但是,您也可以使用GetCommandLineW专门以Unicode格式检索命令行。
答案 1 :(得分:1)
WinMain
/ wWinMain
不是真正的Windows入口点。 Windows只调用PE标题中指定的函数,参数为零。
使用Microsoft工具链时,在创建GUI应用程序时,这是void WinMainCRTStartup() { ... }
,除非您使用/Zl链接,否则它将为您提供。
Visual C ++创建的默认WinMainCRTStartup
代码初始化C运行时库,调用全局构造函数(如果有),然后使用{{WinMain
/ wWinMain
函数调用1}}来自HINSTANCE
,来自GetModuleHandle(NULL)
的命令行(跳过命令行中的文件名)和来自GetStartupInfo
的show命令。
GetCommandLineA/W()
和WinMain
之间的唯一区别是命令行字符串,您应该在Unicode应用程序中使用wWinMain
(这些天创建的所有应用程序都应使用Unicode)。您当然可以在wWinMain
中手动呼叫GetCommandLineW()
并自行解析,如果您真的想要。
在Windows NT / 2000 / XP及更高版本中,命令行是内部的Unicode字符串,WinMain
/ WinMain
为您提供此转换版本,可能无法正确表示每个字符。在Windows 95/98 / ME上,它是另一种方式,但GetCommandLineA()
始终能够转换GetCommandLineW()
中的每个字符。
答案 2 :(得分:0)
默认情况下,Windows XP向上是unicode!因此,不需要转换。 C ++运行时加载器负责传递给应用程序的参数。标准的Win32 API规定主条目是WinMain(...)。