【问题标题】:wmain vs main C runtimewmain 与主 C 运行时
【发布时间】:2011-04-03 01:39:51
【问题描述】:

我读过几篇关于不同 Windows C 入口点 wmain 和 WinMain 的文章。

所以,如果我是正确的,这些将被添加到 Windows 操作系统的 C 语言编译器中。但是,是如何实现的呢?

例如,wmain 将 Unicode 作为 argv[],但是它的 Os 将这些参数发送给程序,那么 .exe 文件条目中是否有任何特殊字段告诉 windows 将 unicode 传递为 unicode?谢谢。

【问题讨论】:

    标签: c unicode winapi wmain


    【解决方案1】:

    现代版本的 Windows 在内部使用 UTF-16。因此,当您启动可执行文件时,所有命令行参数可能从一开始就作为 UTF-16 传递,链接到已启动应用程序的运行时库要么毫发无损地传递参数(如果使用 wmain),要么将它们转换为自动本地编码(如果使用main)。 (具体而言,这将由 wmainCRTStartup/mainCRTStartup 完成,它们是用于控制台 Windows 应用程序的实际入口点。)

    【讨论】:

      【解决方案2】:

      首先:一个迂腐的咆哮:wmain 当然没有得到 Unicode 参数。 Unicode is defined independently 任何特定编码。 wmain 以 Unicode 的 16 位字符编码(猜测为 UTF-16)获取参数。我刚刚查看了 Microsoft 在 wmain 上的文档以及其中的链接,很明显,Microsoft 在编写 Unicode 时并不知道它是什么。

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

      【讨论】:

      • Windows NT 开始在内部使用 UCS-2,但现代版本(主要)使用 UTF-16,这可能解释了为什么文档没有明确说明。此外,序言代码不太可能从本地编码转换为 UTF-16,因为这意味着调用者提供的 UTF-16 参数将通过与本地编码的中间转换,并且因为 Windows 不支持UTF-8 作为本地编码,那将是有损的。因此,我认为情况正好相反。
      • @jamesdlin:我正在阅读 Microsoft 编写的文档。我想他们的字符处理代码足够聪明,如果字符集已经是 UTF-16,则不会应用任何转换。
      • 除非最初获得 UTF-16 数据,否则序言代码如何知道字符是否为 UTF-16?
      猜你喜欢
      • 2019-02-26
      • 1970-01-01
      • 1970-01-01
      • 2018-09-04
      • 2012-12-11
      • 1970-01-01
      • 2015-12-19
      • 2012-10-07
      • 2011-06-28
      相关资源
      最近更新 更多