【问题标题】:Difference between WinMain and wWinMainWinMain 和 wWinMain 的区别
【发布时间】:2010-12-20 00:30:10
【问题描述】:

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

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

如果命令行参数必须是Unicode(比如Unicode文件名,转换会导致部分字符丢失),是不是说我必须使用wWinMain作为入口函数?

【问题讨论】:

    标签: c++ windows winapi unicode


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 您可以为您的信息添加一个来源,以便我们提供更多信息吗?
    • @LazyLeopard 来源哪个语句?
    【解决方案2】:

    Windows XP 以上默认是 unicode!因此,不需要转换。 C++ 运行时加载器负责传递给应用程序的参数。标准 Win32 API 规定主条目是 WinMain(...)。

    【讨论】:

    【解决方案3】:

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

    是的。

    如果命令行参数必须是Unicode(比如Unicode文件名,转换会导致部分字符丢失),是不是说我必须使用wWinMain作为入口函数?

    是的,如果您想正确处理程序的 Unicode 参数,您应该这样做。

    WinMain() on MSDN 的文档也同意。

    不过,您也可以使用 GetCommandLineW 专门以 Unicode 检索命令行。

    【讨论】:

    • 有一篇微软文章WinMain: The Application Entry Point 对这一点讲得相当清楚。 “WinMain 函数与 wWinMain 相同,只是命令行参数作为 ANSI 字符串传递。首选 Unicode 版本。”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-19
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    相关资源
    最近更新 更多