Разница между WinMain и wWinMain
Единственное различие заключается в том, что Winmain принимает char * для параметра lpCmdLine, а wWinMain принимает wchar_t *.
В Windows XP, если запись приложения является WinMain, Windows конвертирует командную строку из Unicode в Ansi и переходит к приложению?
Если параметр командной строки должен быть в Юникоде (например, имя файла Unicode, преобразование приведет к отсутствию некоторых символов), означает ли это, что я должен использовать wWinMain в качестве функции ввода?
Ответы
Ответ 1
В Windows XP, если запись приложения является WinMain, Windows конвертирует командную строку из Unicode в Ansi и переходит к приложению?
Да.
Если параметр командной строки должен быть в Юникоде (например, имя файла Unicode, преобразование приведет к отсутствию некоторых символов), означает ли это, что я должен использовать wWinMain в качестве функции ввода?
Да, вы должны, если хотите правильно обрабатывать аргументы Unicode в своей программе.
Документация к WinMain() в MSDN также согласна.
Однако вы можете использовать GetCommandLineW для извлечения командной строки в Юникоде.
Ответ 2
WinMain
/wWinMain
не является реальной точкой входа Windows. Windows просто вызывает функцию, указанную в заголовке PE с нулевыми параметрами.
При использовании цепочки инструментов Microsoft это void WinMainCRTStartup() { ... }
, когда вы создаете приложение GUI, и оно предоставляется вам, если вы не связываетесь с /Zl.
По умолчанию код WinMainCRTStartup
, созданный Visual С++, инициализирует библиотеку времени выполнения C, вызывает глобальные конструкторы (если есть), а затем вызывает вашу функцию WinMain
/wWinMain
с HINSTANCE
от GetModuleHandle(NULL)
, командной строки из GetCommandLineA/W()
(пропуская над именем файла в командной строке) и команду show из GetStartupInfo
.
Единственная разница между WinMain
и wWinMain
- это строка командной строки, и вы должны использовать wWinMain
в приложениях Unicode (и все приложения, созданные в эти дни, должны использовать Unicode). Конечно, вы можете вручную вызвать GetCommandLineW()
в WinMain
и проанализировать его самостоятельно, если вы действительно этого хотите.
В Windows NT/2000/XP и более поздняя строка командной строки является строкой Unicode внутри, а WinMain
/GetCommandLineA()
дает вам преобразованную версию, которая может быть неспособна правильно представлять каждый символ. В Windows 95/98/ME это наоборот, но GetCommandLineW()
всегда способен преобразовывать каждый символ из GetCommandLineA()
.
Ответ 3
Windows XP вверх по умолчанию является unicode! Таким образом, конверсия не требуется. Загрузчик Runtime С++ заботится о передаче аргумента в приложение. Стандартный API Win32 определяет, что главная запись - WinMain (...).