WinMain和wWinMain之间的区别

cut*_*CAT 20 c++ windows unicode winapi

唯一的区别是Winmain为lpCmdLine参数获取char*,而wWinMain接受wchar_t*.

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

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

Joe*_*oey 14

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

是.

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

是的,您应该,如果您想正确处理程序的Unicode参数.

MSDNWinMain()的文档也同意.

但是,您也可以使用GetCommandLineW来专门检索Unicode中的命令行.


And*_*ers 7

WinMain/wWinMain不是真正的 Windows 入口点。Windows 只是使用零参数调用PE标头中指定的函数。

使用 Microsoft 工具链时,这是void WinMainCRTStartup() { ... }在创建 GUI 应用程序时为您提供的,除非您与/Zl链接。

WinMainCRTStartupVisual C++ 创建的默认代码初始化 C 运行时库,调用全局构造函数(如果有),然后使用from 、命令行 from (跳过命令行中的文件名)和 show调用您的WinMain/wWinMain函数命令来自.HINSTANCEGetModuleHandle(NULL)GetCommandLineA/W()GetStartupInfo

WinMain和之间的唯一区别wWinMain是命令行字符串,您应该wWinMain在 Unicode 应用程序中使用(并且现在创建的所有应用程序都应该使用 Unicode)。你当然也可以手动调用GetCommandLineW()WinMain和自己解析它,如果你真的想。

在 Windows NT/2000/XP 和更高版本中,命令行在内部是一个 Unicode 字符串,并且WinMain/GetCommandLineA()为您提供了一个转换版本,它可能无法正确表示每个字符。在 Windows 95/98/ME 上,情况正好相反,但GetCommandLineW()始终能够将每个字符从GetCommandLineA().