Какие функции выполняет WinMainCRTStartup?

это часть серии, по крайней мере, двух тесно связанных, но различных вопросов. Надеюсь, я поступаю правильно, спрашивая их отдельно.

Я пытаюсь заставить приложение Visual C++ 2008 работать без библиотеки времени выполнения C. Это приложение Win32 GUI без MFC или других причудливых вещей,просто Windows API.

поэтому я устанавливаю свойства проекта - > конфигурация - > C / C++ - > дополнительно - > опустить имена библиотек по умолчанию в Yes (флаг компилятора /Zl) и перестроенный.

тогда компоновщик жалуется на неразрешенный внешний _WinMainCRTStartup. Справедливо, я могу сказать компоновщику использовать другую точку входа, скажем MyStartup. Из того, что я собрал в интернете,_WinMainCRTStartup делает некоторые вещи инициализации, и я, вероятно, хочу MyStartup сделать подмножество.

Итак, мой вопрос: какие функции _WinMainCRTStartup выполнить, и какой из них я могу опустить, если я не использую CRT?

если вы осведомлены об этом материале, пожалуйста, посмотрите на мой другой вопрос тоже. Спасибо!

в сторону: Почему я хочу сделать это в первую очередь?

  1. мое приложение явно не использует никаких функций CRT.
  2. мне нравятся худые и средние приложения.
  3. он научит меня чему-то новому.

3 ответов


точка входа ЭЛТ делает следующее (Этот список не завершен):

  • инициализирует глобальное состояние, необходимое ЭЛТ. Если это не сделано, вы не можете использовать какие-либо функции или состояние, предоставляемые CRT.
  • инициализирует некоторое глобальное состояние, используемое компилятором. Проверки во время выполнения, такие как файл cookie безопасности, используемый /GS, определенно выделяется здесь. Вы можете позвонить __security _ init _ cookie однако сами. Возможно, потребуется добавить другой код для других проверок времени выполнения.
  • вызывает конструкторы для объектов C++. Если вы пишете код на C++, возможно, вам придется повторить это.
  • извлекает командную строку и запускает информацию, предоставленную ОС,и передает ее вашему основному. По умолчанию никакие параметры не передаются в точку входа программы ОС - все они проверяются ЭЛТ.

исходный код CRT доступен в Visual Studio, и вы можете пройти через точку входа CRT в отладчик и узнайте, что именно он делает.


A true программа Win32, написанная на C (не c++), вообще не нуждается в инициализации, поэтому вы можете начать свой проект с WinMainCRTStartup() вместо WinMain (HINSTANCE,...).

также возможно, но немного сложнее писать консольные программы как истинные приложения Win32; имя точки входа по умолчанию _mainCRTStartup ().

отключите все дополнительные функции генерации кода, такие как зонды стека, массив проверки и т. д. Отладка все еще возможна.

инициализации

иногда вам нужен первый . Для Win32 (кроме Win32s), он фиксируется на (HINSTANCE)0x400000 в.

на nCmdShow.

предостережения

вы столкнетесь со значительными проблемами, когда:

  • использование кадров стека (т. е. локальных переменных) размером более 4 Кбайт (на функцию)
  • использование арифметики с плавающей запятой (например, float - >int преобразование)
  • использование 64-разрядных целых чисел на 32-разрядных машинах (операции умножения, сдвига)
  • на C++ новая, удалить, и статические объекты с конструкторами ненулевых-вне-Все-членов
  • использование стандартных библиотечных функций, таких как fopen (), printf () конечно

Диагностика

существует стандартная библиотека C, доступная во всех системах Windows (начиная с Windows 95), the библиотеки msvcrt.Dll файлы.

чтобы использовать его, импортируйте их точки входа, например, используя my библиотеки msvcrt-свет.Либ!--4--> (google для этого). Но есть еще некоторые предостережения, особенно при использовании компиляторов новее MSVC6:

  • кадры стека по-прежнему ограничены 4 Кбайт
  • _ftol_sse или _ftol2_sse должен быть направлен в _ftol
  • _iob_func необходимо направить к _iob

его инициализация, похоже, выполняется во время загрузки. По крайней мере, файловые функции будут работать без проблем.


старый вопрос, но ответы либо неверны, либо сосредоточены на одной конкретной проблеме.

существует ряд функций C и C++, которые просто не будут доступны в Windows (или в большинстве операционных систем, если на то пошло), если программы действительно запущены в main/WinMain.

возьмите этот простой пример:

class my_class
{
public:
    my_class() { m_val = 5; }
    int my_func(){ return m_val }
private:
    int m_val;
}

my_class g_class;

int main(int argc, char **argv)
{
     return g_class.my_func();
}

для того, чтобы эта программа функционировала должным образом, конструктор для my_class должен быть вызван перед main. Если программа начал точно в main, это потребует взлома компилятора (Примечание: GCC делает это в некоторых случаях), чтобы вставить вызов функции в самом начале main. Вместо этого в большинстве ОС и в большинстве случаев другая функция создает g_class, а затем вызывает main (в Windows это либо mainCRTStartup, либо WinMainCRTStartup; в большинстве других ОС, к которым я привык, это функция под названием _start).

есть и другие вещи, которые C++ и даже C требуют выполнения до или после main для работы. Как stdin и stdout (std::cin и std::cout) можно использовать, как только начнется main? Как работает atexit?

стандарт C требует, чтобы стандартная библиотека имела POSIX-подобный API сигнала, который в Windows должен быть "установлен" перед main().

в большинстве ОС нет системной кучи; среда выполнения C реализует свою собственную кучу (среда выполнения Microsoft C просто обертывает функции кучи Kernel32).

даже аргументы, переданные main, argc и argv, должны быть получены из системы как-то.

возможно, вы захотите взглянуть на статьи Мэтта Пьетрика (древние) о реализации его собственной среды выполнения C для подробностей о том, как это работает с Windows + MSVC (Примечание: MinGW и Cygwin реализуют определенные вещи по-разному, но на самом деле возвращаются к MSVCRT для большинства вещей): http://msdn.microsoft.com/en-us/library/bb985746.aspx