| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > WinMain и классы |
| Автор: Nastya 17.2.2003, 01:08 |
| Мне сегодня задали такой вопрос. Как запихнуть функцию WinMain (или просто Main) в класс. Например, класс апликейшн. В коде программы мы вызываем метод run, а он в свою очередь WinMain - но как это реализовано и можно ли этот фокус повторить вручную Я даже не представляю, а вы? |
| Автор: Alex101 17.2.2003, 08:02 |
| Из процедуры на асме - изи |
| Автор: Nastya 17.2.2003, 21:07 | ||
Ну и вчем судь процедуры. Сам процесс Как выглядит структура программы |
| Автор: Baa 17.2.2003, 21:20 |
| Насть, посмори, как енто в MFC сделано... з.ы. не уверен, что енто там в классы засунуто... посмори всякие макросы BEGIN_MESSAGE_MAP, END_MESSAGE_MAP |
| Автор: Step 17.2.2003, 22:01 |
| Nastya если ты работашь в ВС то просто составь любое приложение и вместо запуска нажми Ф10 и ты сразу попадеш в винмаин, пошаговое выполнение функций и ты поймеш, как и что работает. |
| Автор: Fantasist 19.2.2003, 05:46 |
| Что-то не въехал в вопрос. Это наоборот обычно - из WinMain вызывается какая-то ваша процедура или метод класса. Ведь что такое WinMain? Это функция, условно говоря, входная точка в программу. То есть, вот вы запускаете exe-шник. Какой код система должна начинать исполнять? Очень просто - в файле exe есть заголовок, по определенному смещению которого находиться адрес входной точки. В этот адрес система и передает управление. Кто же записывает туда этот адрес? Естесственно компилятор, а точнее линковщик. Вы можете в опциях линкера указать, входную точку, то есть функцию, которая и будет вызыватся самой первой. Можно ли сделать ее методом класса? Теоретически можно попробовать, практически - возможно сработает со статическими методами. Есть такой фактор, как декорация имен, в результате которого в откомпилированном файле имена методов могут быть изменены и линкер их просто не найдет (если вы, конечно, не укажате измененное имя). Набор параметров также может являть проблему (указатель на экземляр класса для не статического метода). Потом надо помнить, что, на самом деле, чаще всего, WinMain не является входной точкой. Существует такой модуль как RTL (Run-Time Library), называемый чаще CRT и вот в нем находиться функция, которая и является входной точкой. В CRT от VC существует две такие функции - mainCRTStartUp и WinMainCRTStartUp (точнее, два модуля), которые соответсвенно вызывают функции main и WinMain, но перед этим проводят необходимую инициализацию (инициализация хипа, глобальных переменных и т. п.). Если вы установите свою точку входа, то вы лишитесь этой инициализации. |
| Автор: AntonSaburov 19.2.2003, 18:27 |
| Вообщем, путем всяческих ухищрений, такое сделать можно. Хотя это достижение будет мало кого волновать, потому как никому такое не надо. Самый главный вопрос - ЗАЧЕМ ? |