WinMain和wWinMain之间的区别

时间:2009-11-24 19:12:52

标签: c++ windows winapi unicode

唯一的区别是Winmain为lpCmdLine参数取char *,而wWinMain取wchar_t *。

在Windows XP上,如果应用程序条目是WinMain,Windows是否会将命令行从Unicode转换为Ansi并传递给应用程序?

如果命令行参数必须是Unicode(例如,Unicode文件名,转换会导致某些字符丢失),这是否意味着我必须使用wWinMain作为输入函数?

3 个答案:

答案 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(...)。