Как я могу записать Приложение Windows, не используя WinMain?

Можете ли вы поделиться журналами задач индексирования ?

согласно: https://groups.google.com/forum/#!topic/druid-user/yZEnAk0iKr4 и https://groups.google.com/forum/#!topic/druid-user/ZBTU08VNp2o это может быть нехватка памяти в менеджере среднего звена

14
задан Erik Funkenbusch 19 February 2009 в 10:45
поделиться

3 ответа

У Вас есть неправильное понимание. Различием между основным и WinMain, кроме некоторого differet кода инициализации, являются параметры, переданные ему.

основные взгляды как это:

int main(int argc, char* argv[]);

В то время как WinMain похож на это:

int WINAPI WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow
);

Что-то должно установить те параметры и выполнить вызов, и это - код запуска. Когда Вы компилируете и связываете программу, один из параметров компоновщика является точкой входа, и это будет, в зависимости от консоли или приложения для GUI, другого бита кода запуска.

Можно, конечно, написать собственный код запуска, просто войти исходный каталог Visual C++, и можно найти код запуска, он назвал crt0.c, и это находится в каталоге VC\crt\src.

15
ответ дан 1 December 2019 в 09:13
поделиться

Это работает другой путь. Существует статически файл связанного объекта, который идет с компилятором, который содержит фактическую точку входа. Та точка входа делает инициализацию и затем называет Вашу точку входа (т.е. WinMain).

То, что та статическая часть ожидает называть, может быть tweakable. Например, в Visual Studio существует поле для имени точки входа в настройках компоновщика.

6
ответ дан 1 December 2019 в 09:13
поделиться

С Просто основным, Вы не можете кодировать Winmain. Для выравниваний Следующие утверждения были взяты из http://blogs.msdn.com/oldnewthing/archive/2007/12/03/6644060.aspx

[В Windows Programming], Почему точку входа приложения не назвали основной? Ну, с одной стороны, основное имя было уже взято, и Windows не имел полномочий для резервирования альтернативного определения. Тогда не было никакого комитета по стандартизации языка C; C был тем, что Dennis сказал, что это было, и едва гарантировалось, что Dennis сделает любые специальные шаги для сохранения совместимости исходного кода Windows в любой будущей версии языка C. Так как K&R не указывал, что реализации могли расширить приемлемые формы основной функции, было совершенно возможно, что был легальный компилятор C, который отклонил программы который объявленный основным неправильно. Текущий стандарт языка C явно разрешает определенные для реализации альтернативные определения для основного, но требующий, чтобы все компиляторы поддерживали эту новую определенную для Windows версию, для компиляции Windows-программ, бесплатно ограничил бы набор компиляторов, которые Вы могли использовать для записи Windows-программ.

Если бы Вам удалось преодолеть то препятствие, то у Вас была бы проблема, что версия Windows основного должна будет быть чем-то вроде этого:

int main(int argc, char *argv[], HINSTANCE hinst,
         HINSTANCE hinstPrev, int nCmdShow);

Из-за пути C связь был выполнен, все изменения функции должны были договориться о параметрах, которые они имели общего. Это означает, что версия Windows должна была бы добавить свои параметры на конец самой долгой существующей версии основного, и затем необходимо будет скрестить пальцы и надеяться, что язык C никогда не добавлял другую альтернативную версию основного. Если Вы пошли этим путем, Ваши скрещенные пальцы привели Вас к сбою, потому что оказывается, что третий параметр был добавлен к основному некоторое время спустя, и это конфликтовало с Вашей благоприятной для Windows версией.

Предположим, что Вам удалось убедить Dennis не признавать что версия с тремя параметрами основного. Все еще необходимо придумать те первые два параметра, что означает, что код запуска каждой программы должен содержать синтаксический анализатор командной строки. Назад в 16-разрядные дни, люди урезали для сохранения каждого байта. Сообщение их, "О, и все Ваши программы будут на 2 КБ больше", вероятно, не сделало бы Вас большим количеством друзей. Я имею в виду, это - четыре сектора ввода-вывода от гибкого диска!

Но вероятно причина, почему точке входа Windows дали другое имя, состоит в том, чтобы подчеркнуть, что это - другая среда выполнения. Если бы это назвали основным, то люди взяли бы программы C, разработанные для консольной среды, бросили бы их в их компилятор Windows и затем выполнили бы их с катастрофическими результатами.

Надежда это очищает Ваши сомнения.

8
ответ дан 1 December 2019 в 09:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: