Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Тип проекта, Win32, Console etc. 
V
    Опции темы
Hagrael
Дата 22.7.2011, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 26.6.2011

Репутация: нет
Всего: нет



Здравствуйте, форумчане.

Я заметил, что когда создаешь Console Application, то программа начинается с функции main, а когда Win32 GUI Application, то главная функция программы - функция WinMain. Значит ли это, что проект компилируется по-разному в зависимости от его типа?

Заранее благодарен.

Это сообщение отредактировал(а) Hagrael - 22.7.2011, 16:16
PM MAIL   Вверх
triclosan
Дата 22.7.2011, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 515
Регистрация: 18.8.2006

Репутация: 2
Всего: 12



WinMain ?
PM MAIL   Вверх
Hagrael
Дата 22.7.2011, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 26.6.2011

Репутация: нет
Всего: нет



triclosan, да, опечатка smile
PM MAIL   Вверх
bsa
Дата 22.7.2011, 17:24 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(Hagrael @  22.7.2011,  15:09 Найти цитируемый пост)
Значит ли это, что проект компилируется по-разному в зависимости от его типа?

Компилируется он так же, он линкуется с разным начальным кодом - операционная система при запуске программы передает управление не твоим функциям, а к начальному коду, который уже запускает твою функцию.
PM   Вверх
Hagrael
Дата 23.7.2011, 07:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 26.6.2011

Репутация: нет
Всего: нет



bsa, признаться, я не очень понял. Раз он линкуется с разным кодом, то выходит, объектный код модифицируется? о_О
PM MAIL   Вверх
volatile
Дата 23.7.2011, 10:17 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Hagrael, Первой функцией выполняющейся в программе является не "main" и не "winmain".
Сначала выполняется библиотечная точка входа, которая делает несколько полезных вещей
(инициализацию CRT переменных, разбиение управляющей строки на массив (char * argv[]) и проч.)
и затем передает управление вашей функции "main" или "winmain".

Изменяя тип приложения Console / GUI  вы выбираете другой стартовый код.
стартовый код GUI делает несколько другие вещи чем стартовый код Console, и в том числе вызывает не "main", а "WinMain"

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

/ENTRY:myfunc


Теперь сразу будет выполняться функция int myfunc(); (вместо myfunc можете выбрать любое имя)
Естественно ни "main", ни "WinMain" в этом случае выполняться не будут. ( если они не вызываются из myfunc(); )

Делать так не советую, так как в этом случае вы отказываетесь от инициализации CRT, и не сможете пользоватся многими библиотечными функциями.
Показал только в качестве иллюстрации.

PM MAIL   Вверх
bsa
Дата 24.7.2011, 16:56 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(Hagrael @  23.7.2011,  07:06 Найти цитируемый пост)
 Раз он линкуется с разным кодом, то выходит, объектный код модифицируется?

объектный код генерирует компилятор (это файлы с расширением *.obj), а линкер соединяет объектные файлы и библиотеки и делает уже требуемый исполняемый или библиотечный файл. Так вот, в комлекте с компилятором (имеется в виду инструментарий необходимый для сборки программ, что-то вроде Platform SDK) идет несколько объектных файлов. Они нужны для соединения с разными видами проектов: dll, console, GUI...

Это сообщение отредактировал(а) bsa - 24.7.2011, 16:57
PM   Вверх
Hagrael
Дата 25.7.2011, 06:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 26.6.2011

Репутация: нет
Всего: нет



Понятно. Но что из себя представляет файл .obj? Начальную функцию? А мой код тоже превращается в .obj?
PM MAIL   Вверх
bsa
Дата 25.7.2011, 12:25 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Hagrael, почитай это:
http://forum.vingrad.ru/forum/topic-270683...eprocessor.html
http://forum.vingrad.ru/index.php?show_typ...&kw=faq-c++

Объектный файл - это машинный код соответствующий твоей программе (точнее, той ее части, которая была в файле, из которого получился *.obj), но без связей с другими модулями. Все данные, необходимые для их организации, находятся в таблицах импорта и экспорта. Эти таблицы читаются линкером (компоновщиком) у всех объединяемых объектных файлов и библиотек (статическая библиотека - это в большинстве случаев просто архив объектных файлов), а затем происходит подстановка вместо символов из таблиц импорта каждого модуля соответствующие адреса из таблиц экспорта. В итоге получается уже работающий машинный код.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0485 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.