【发布时间】:2011-04-03 01:39:51
【问题描述】:
我读过几篇关于不同 Windows C 入口点 wmain 和 WinMain 的文章。
所以,如果我是正确的,这些将被添加到 Windows 操作系统的 C 语言编译器中。但是,是如何实现的呢?
例如,wmain 将 Unicode 作为 argv[],但是它的 Os 将这些参数发送给程序,那么 .exe 文件条目中是否有任何特殊字段告诉 windows 将 unicode 传递为 unicode?谢谢。
【问题讨论】:
我读过几篇关于不同 Windows C 入口点 wmain 和 WinMain 的文章。
所以,如果我是正确的,这些将被添加到 Windows 操作系统的 C 语言编译器中。但是,是如何实现的呢?
例如,wmain 将 Unicode 作为 argv[],但是它的 Os 将这些参数发送给程序,那么 .exe 文件条目中是否有任何特殊字段告诉 windows 将 unicode 传递为 unicode?谢谢。
【问题讨论】:
现代版本的 Windows 在内部使用 UTF-16。因此,当您启动可执行文件时,所有命令行参数可能从一开始就作为 UTF-16 传递,链接到已启动应用程序的运行时库要么毫发无损地传递参数(如果使用 wmain),要么将它们转换为自动本地编码(如果使用main)。 (具体而言,这将由 wmainCRTStartup/mainCRTStartup 完成,它们是用于控制台 Windows 应用程序的实际入口点。)
【讨论】:
首先:一个迂腐的咆哮:wmain 当然没有得到 Unicode 参数。 Unicode is defined independently 任何特定编码。 wmain 以 Unicode 的 16 位字符编码(猜测为 UTF-16)获取参数。我刚刚查看了 Microsoft 在 wmain 上的文档以及其中的链接,很明显,Microsoft 在编写 Unicode 时并不知道它是什么。
无论如何,程序的入口点是由链接器定义的。 C 程序总是有一定数量的序言代码在 main/wmain/WinMain/wWinMain 之前运行。如果使用 main 的宽版本之一,则序言代码会将环境中的字符从它们所在的任何字符集转换为宽字符版本。
【讨论】: