wmain vs main C runtime

Я прочитал несколько статей о различных входных пулах Windows C, wmain и WinMain.

Итак, если я прав, они добавляются в компиляторы языка Си для ОС Windows. Но как это реализовано?

Например, wmain получает Unicode как argv[], но его Os, который отправляет эти аргументы в программу, есть ли в записи файла.exe какое-либо специальное поле, в котором говорится, чтобы windows передавал аргументы как unicode? Благодарю.

2 ответа

Решение

Современные версии Windows внутренне используют UTF-16. Поэтому, когда вы запускаете исполняемый файл, все аргументы командной строки, скорее всего, передаются как UTF-16 с самого начала, и библиотека времени выполнения, связанная с запущенным приложением, либо передает аргументы без изменений (если используется wmain) или автоматически преобразует их в локальную кодировку (при использовании main). (В частности, это будет сделано wmainCRTStartup/mainCRTStartup которые являются фактическими точками входа, используемыми для консольных приложений Windows.)

Во-первых, педантичная напыщенная речь: wmain определенно не получает аргументы Unicode. Юникод определяется независимо от какой-либо конкретной кодировки. wmain получает аргументы в 16-битной кодировке Unicode, UTF-16 в предположении. Я только что проверил документацию Microsoft по wmain и ссылки на нее, и стало ясно, что Microsoft не имела ни малейшего представления о том, что такое Unicode, когда они это писали.

В любом случае, точка входа в программу определяется компоновщиком. Программа A C всегда имеет определенный код пролога, который выполняется до main/wmain/WinMain/wWinMain. Если используется одна из широких версий main, код пролога преобразует символы в среде из любого набора символов, в котором они находятся, в версию широких символов.

Другие вопросы по тегам