2010-08-24 41 views
3

我已经阅读了几篇关于不同的Windows C入口点,wmain和WinMain的文章。wmain vs main C runtime

因此,如果我是正确的,它们将被添加到Windows OS的C语言编译器中。但是,如何实施?

例如,wmain获取Unicode作为argv [],但它的Os将这些参数发送给程序,所以在.exe文件条目中有任何特殊字段,它会向windows传递参数作为unicode?谢谢。

回答

4

现代版本的Windows内部使用UTF-16。因此,在启动可执行文件时,所有命令行参数可能会从头开始以UTF-16的形式传递,并且链接到已启动应用程序的运行时库将通过未受攻击的参数(如果使用wmain)或将它们转换为本地编码自动(如果使用main)。 (具体来说,这可以通过wmainCRTStartup/mainCRTStartup这是控制台Windows应用程序的实际入口点来完成。)

2

第一:迂腐的咆哮:wmain肯定没有得到Unicode参数。任何特定编码的Unicode is defined independently。在猜测中,wmain以16位字符编码的Unicode,UTF-16获取参数。我刚刚检查了微软关于wmain的文档以及它的链接,很显然,微软不知道Unicode是什么时候写的。

无论如何,程序的入口点是由链接器定义的。一个C程序总是有一定数量的prologue代码在main/wmain/WinMain/wWinMain之前运行。如果使用main的一个宽版本,则序言代码将环境中的字符从它们所处的任何字符集转换为宽字符版本。

+2

Windows NT在内部使用UCS-2开始,但现代版本使用(主要是)UTF-16,这可能会解释为什么文件不明确。此外,序言代码不太可能从本地编码转换为UTF-16,因为这意味着调用者提供的UTF-16参数将通过本地编码的中间转换,并且由于Windows不支持UTF-8作为本地编码,这将是有损的。所以我相信这是相反的。 – jamesdlin 2010-08-24 10:59:21

+0

@jamesdlin:我正在阅读由微软撰写的文档。我想他们的字符处理代码非常聪明,如果字符集已经是UTF-16,那么不会有任何转换适用。 – JeremyP 2010-08-24 11:12:27

+0

序言代码如何知道该字符是否为UTF-16,除非它最初获得了UTF-16数据? – jamesdlin 2010-08-24 17:50:31