唯一的区别是Winmain使用char*作为lpCmdLine参数,而wWinMain使用wchar_t*。
在Windows XP上,如果应用程序条目是WinMain,Windows是否会将命令行从Unicode转换为Ansi并传递给应用程序?
如果命令行参数必须是Unicode (例如,Unicode文件名,转换会导致某些字符丢失),这是否意味着我必须使用wWinMain作为入口函数?
发布于 2009-11-25 03:22:01
在Windows XP上,如果应用程序条目是WinMain,Windows是否会将命令行从Unicode转换为Ansi并传递给应用程序?
是。
如果命令行参数必须是Unicode (例如,Unicode文件名,转换会导致某些字符丢失),这是否意味着我必须使用wWinMain作为入口函数?
是的,如果您想要正确地处理程序的Unicode参数,您应该这样做。
WinMain() on MSDN的文档也同意这一点。
但是,您也可以使用GetCommandLineW来检索命令行,特别是使用Unicode。
发布于 2017-10-04 00:03:15
WinMain/wWinMain不是真正的Windows入口点。Windows只调用PE头中指定的函数,不带任何参数。
当使用微软的工具链时,这是你创建图形用户界面应用程序时的void WinMainCRTStartup() { ... },除非你链接到/Zl,否则它会为你提供。
Visual C++创建的默认WinMainCRTStartup代码初始化C运行时库,调用全局构造函数(如果有),然后使用来自GetModuleHandle(NULL)的HINSTANCE、来自GetCommandLineA/W()的命令行(跳过命令行中的文件名)和来自GetStartupInfo的show命令调用WinMain/wWinMain函数。
WinMain和wWinMain之间的惟一区别是命令行字符串,您应该在Unicode应用程序中使用wWinMain (并且现在创建的所有应用程序都应该使用Unicode)。当然,您可以手动调用WinMain中的GetCommandLineW()并自己解析它,如果您真的愿意的话。
在Windows NT/2000/XP和更高版本中,命令行在内部是Unicode字符串,而WinMain/GetCommandLineA()提供的是它的转换版本,它可能不能正确地表示每个字符。在Windows95/98/ME上,情况正好相反,但GetCommandLineW()总是能够转换GetCommandLineA()中的每个字符。
发布于 2009-11-25 03:22:44
Windows XP及以上版本默认为unicode!因此,不需要转换。C++运行时加载程序负责传递给应用程序的参数。标准的Win32应用编程接口规定主条目为WinMain(...)。
https://stackoverflow.com/questions/1792275
复制相似问题