Почему __tmainCRTStartup вызывает WinMain, когда _UNICODE определен? - PullRequest
0 голосов
/ 18 апреля 2011

Вы можете попробовать это прямо сейчас.

Определить как WinMain, так и wWinMain и скомпилировать его как статическую библиотеку.

Создать новый проект для исполняемого файла exe.

Задать настройку набора символов UNICODE system. (Определить _UNICODE)

Связать только что созданную статическую библиотеку.

Затем ваша программа запускается из WinMain.

Является ли набор символов многоБайт или юникод, WinMain вызывается, когда определены и WinMain, и wWinMain.

Это происходит только при определении WinMain в статической библиотеке.

Когда вы определяете WinMain и wWinMain в исходном проектев том числе, он работает правильно,

системные вызовы Unicode wWinMain и многобайтовые системные вызовы WinMain.

Почему это происходит?

1 Ответ

0 голосов
/ 18 апреля 2011

Линкер пытается определить, какая у вас точка входа, и заменить соответствующую реализацию __tmainCRTStartup.Однако здесь есть два ограничения:

  • Линкер не был предназначен для предположения между двумя или более точками входа.Фактически, компоновщик выдает предупреждение LNK4067: неоднозначная точка входа , когда находит более одного выбора.
  • Линкер не знает о препроцессоре, поэтому любые символы препроцессора, которые вы определили, не имеют значения во время работы компоновщика,

Итак, чтобы ответить на ваш вопрос, почему вы видите это, вы попали в один из случаев «неопределенного поведения».Вы не должны полагаться на это поведение, потому что оно не гарантированно работает и может измениться в новой версии компилятора.

Я предлагаю вам определить одну единственную точку входа, используя _tWinMain:

int APIENTRY _tWinMain(HINSTANCE hInstance,   
                 HINSTANCE hPrevInstance,   
                 LPTSTR    lpCmdLine,   
                 int       nCmdShow)   

Существует также опция / ENTRY для компоновщика, но я не рекомендую использовать ее, поскольку она более опаснаи вы можете выполнить ту же функцию, просто определив функцию единого входа и передав правильное значение для опции компоновщика / SUBSYSTEM.

...