Вопрос

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

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

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

Тогда линкер жалуется на неразрешенную внешнюю _WinMainCRTStartup. Анкет Достаточно справедливо, я могу сказать линкеру использовать другую точку входа, скажем, MyStartup. Анкет Из того, что я собираю в Интернете, _WinMainCRTStartup делает что -то инициализацию, и я, вероятно, хочу MyStartup сделать подмножество этого.

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

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

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

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

Решение

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

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

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

Другие советы

А истинный Программа Win32, написанная в C (не C ++), вообще не нуждается в инициализации, поэтому вы можете начать свой проект с Winmaincrtstartup () вместо Winmain (hinstance, ...).

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

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

Инициализация

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

А ncmdshow параметр всегда SW_SHOWDEFAULT.

При необходимости извлеките командную строку с GetCommandline ().

Завершение

Когда ваша программа порождает потоки, например, позвонив Getopenfilename (), возвращаясь из Winmaincrtstartup () с возвращаться Ключевое слово повесит вашу программу - используйте ExitProcess () вместо.

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

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

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

Устранение неполадок

На всех системах Windows доступна стандартная библиотека C (с Windows 95), Msvcrt.dll.

Чтобы использовать его, импортировать их точки входа, например, используя мой msvcrt-light.lib (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; на большинстве других OSE, к которым я привык, является функцией, называемой _Start).

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

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

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

Даже аргументы, переданные в Main, ARGC и ARGV, должны быть как -то из системы.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top