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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WinMain или main? Это одно и то же? 
:(
    Опции темы
NiJazz
  Дата 30.8.2003, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

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



Можно ли в C++ Builder использовать вызов main() как главную функцию (без define)?
PM MAIL   Вверх
RAN
Дата 30.8.2003, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

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



Что значит "без define"? WinMain используется в Win32 приложениях, а main в стандартных C прогах (в DOS, Unix .....)
Разгадка в том, что на самом деле выполнение Вашей программы начинается с C RunTime (CRT). Это код, который автоматически компануется с программой, и выполняет различные начальные операции и установки, а также вызывает Вашу функцию main или WinMain, а когда она (main или WinMain) возвращает управление в CRT, последняя выполняет некоторые заключительные операции.

Так вот, если Вы пишите программу для Windows, то компилятор компанует CRT для Windows. Этот код вызывает WinMain. Если прога для консольного выполнения - то компилятор компанует CRT для консоли. Тот код вызывает main. В Builder'е CRT находится в файлах \lib\c0*.obj. Их там несколько. Потому что кроме того, что программа может быть написана для Windows или для DOS, программа может быть написана на C++ или чистом C. А C++ тоже требует своей CRT с операторами new, delete, <<, >> и других.

Так что если ты создал проект для Win32, то должен использовать только WinMain, а если проект создавался для DOS - то только main.
PM MAIL ICQ   Вверх
Baa
Дата 30.8.2003, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

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



Ну вот, кстати, можно под винды писать без CRT wink.gif очень много статей, как писать мизерные приложения smile.gif
А про точку входа, дык можно её переназначить wink.gif
з.ы. да и вместо new можно использовать GlobalAlloc etc.


--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
RAN
Дата 30.8.2003, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

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



Baa, я с тобой согласен, но вопрос был не о CRT, а о функциях main и WinMain. Я и попытался объяснить, что откуда берётся. А про мизерные приложения вопрошающему, по-моему, ещё рано объяснять. Это ему только прибавит головной боли.
P.S. Написать прогу совсем без CRT нельзя, минимальная CRT: вызов функции main.
PM MAIL ICQ   Вверх
Baa
Дата 30.8.2003, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

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



NiJazz, вот smile.gif советую почитать, может еще не читал smile.gif
http://www.rsdn.ru/article/cpp/crt.xml
там и про WinMain, и про CRT smile.gif
Правда не про билдер, но тоже весьма познавательно wink.gif


--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
GanZaleZ
Дата 1.9.2003, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Привет всем !
Хмм ... Я вот подумал и решил что тоже не могу понять какое различие ??
Именно различие какое кроме точки входа confused.gif
Сачала кинулась мысль нащет выборки сообщений и все такое , но поразмыслив я решил что в консоли то тоже есть выборка сообщений только внутри и еще подума почемуто пришол к выводу что они отличаются только тем что :
При вызове WinMain() система отдает прорисовку , обработку событий и тд.и тп. тибе ,тобиш разработчику , а при вызове консол апликейшн , тобиш main() , полность за окно отвечает сама система !
Вот к чему я пришол ! smile.gif
PM MAIL   Вверх
Baa
Дата 1.9.2003, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

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



Все еще проще wink.gif Отличаются они только названием (ну тобишь аргументами там, вобщем в данном случае не принципиально), а за тип приложение отвечает ключ /SUBSYSTEM wink.gif
/SUBSYSTEM:CONSOLE
или
/SUBSYSTEM:WINDOWS


--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
RAN
Дата 1.9.2003, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

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



Слушай, Baa. Ну, я с тобой не согласен. Разница не в определении, а в подходе к вопросу. main получает параметры командной строки и ориентирована прежде всего не на консоль, а на DOS, Unix и т.п. WinMain ввели именно из-за нового подхода к программированию в Windows. Без этой функции пришлось бы придумывать разные хитрости, чтоб программа могла узнать свой дескриптор, ну и режим отображения окна, что, конечно, уже не так важно.

P.S. Я согласен, что любое соглашение надумано и его можно обойти, сказав, например, что в моей проге главной будет функция WinMustDie с моим набором параметров, но я не хотел бы, чтоб после этой темы, начинающие программисты думали, что main и WinMain - это одно и то же.

PM MAIL ICQ   Вверх
Baa
Дата 1.9.2003, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

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



Хорошо, я с тобой соглашусь, но только ради начинающих программеров smile.gif
Просто это мне напоминает догму, что на 0 делить нельзя...
Вобщем, предлагаю остановиться (это аутотренинг...)
на выдержке из MSDN'а
Цитата

The WinMain function is called by the system as the initial entry point for a Windows-based application

з.ы.
"...Как и все остальные, ты был рожден в оковах, в темнице, которую ты не чувствуешь. Это тюрьма для твоего разума. К несчастью, никому нельзя объяснить, что такое windows. Ты должен посмотреть на это сам. Это твой последний шанс. Потом назад дороги не будет. Ты выбираешь синюю таблетку, все это заканчивается, и ты просыпаешься в своей постели и веришь в то, во что хочешь поверить. Ты выбираешь красную таблетку, и остаешься в стране чудес. Я покажу тебе, насколько глубока эта заячья нора. И помни, что я лишь предлагаю тебе правду, не более того..."


--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
WinMain
Дата 2.9.2003, 12:45 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











В принципе ничего не мешает и в C++ Builder создать новый файл Hello.cpp и набить в нем что-то типа:

#include <iostream.h>

void main()
{
cout << "Hello!!!";
}

Затем, войдя в консольный режим, скомпилировать это в командной строке bcc32 Hello (находясь в той директории, где сам исходный файл)
В результате получится консольное Win32-приложение Hello.exe
В командной строке наберите Hello.exe и увидите в ответ надпись Hello!!!

  Вверх
Baa
Дата 2.9.2003, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

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



WinMain, почитай всю дискуссию внимательнее.


--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
Unregistered
Дата 2.9.2003, 21:05 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитирую NiJazz (самый первый вопрос):
Можно ли в C++ Builder использовать вызов main() как главную функцию (без define)?

Я своим мини-примером ответил на этот вопрос.
  Вверх
RAN
Дата 2.9.2003, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

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



Так ведь можно в Builder'е создать Console Application. И компилировать прям из IDE, без сложностей с командной строкой
PM MAIL ICQ   Вверх
Ars
Дата 3.9.2003, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 28.8.2003
Где: Московская обл.

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



Правильно ли я понимаю, что в консольном приложении за создание окна ответственен CRT?


--------------------
Есть многое на свете, друг Горацио,
С чем очень долго можно прое..!
PM MAIL   Вверх
RAN
Дата 3.9.2003, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Экс. модератор
Сообщений: 709
Регистрация: 14.3.2003
Где: Щёлково Моск.обл.

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



И да, и нет. Да - в том смысле, что кое-что для появления окна консоли (если оно ещё не на экране) делается в CRT. А нет - в том смысле, что это не то, что ты, по-моему, думаешь. Там нет ни CreateWindow или ShowWindow, и даже нет цикла обработки сообщений. Там используется одна единственная функция HANDLE GetStdHandle( DWORD ). Эта функция в зависимости от параметра возвращает дескриптор для стандартного устройства ввода - консоли (параметр STD_INPUT_HANDLE), вывода (STD_OUTPUT_HANDLE) или устройство вывода сообщений об ошибках (STD_ERROR_HANDLE). Но это дескриптор не окна, а устройства ввода/вывода (как у файлов).
Этот дескриптор можно использовать в ReadFile и WriteFile.

P.S. Ах, да. Ещё есть функции AllocConsole и FreeConsole, смысл которых, я думаю, понятен из названия
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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