Miguel Altamirano Morales Ответов: 2

Почему приложение C++ не имеет основной функции int ?


Еще раз Привет, мир, Я работаю со своим первым проектом на C++, даже не имея предыдущего опыта работы на этом языке. До сих пор я читал, что проект C++ должен иметь начальное имя функции "int Main", но у этого конкретного проекта его просто нет.

Почему?. Возможно ли установить другую точку входа для приложения C++?. Как я могу это сделать?, где я могу найти эту конкретную функцию, если это стандартный метод ?

Заранее спасибо.

Что я уже пробовал:

Я вообще ничего не пробовал по этому поводу, приложение работает нормально, так что я очень заинтригован.

Dave Kreskowiak

Библиотечные проекты (компилируемые вплоть до.DLL) не имеют основного метода.

Miguel Altamirano Morales

Большое спасибо за ответ, Дейв. Это приложение является родным проектом C++, разработанным с помощью Visual Studio 2010, и оно создает exe-файл, так что я думаю, что это не библиотечный проект, или нет?.

Привет из Мехико, извините за мой английский.

Jochen Arndt

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

Miguel Altamirano Morales

Большое спасибо за ваш совет, Йохен. Приложение представляет собой собственный проект C++, разработанный с помощью Visual Studio 2010, работает в Windows 7 и создает exe-файл .

Привет из Мехико, извините за мой английский.

jeron1

Вы пробовали искать WinMain?

Miguel Altamirano Morales

Единственная ссылка на WinMain, которую я нашел, - это этот комментарий:

// Дополнительные инициализации: для того, чтобы переопределить значение по умолчанию функции WinMain

затем следует функция, которая, как я полагаю, является той, которая избегает WinMain. Может быть, это и есть мой ответ.

Спасибо

Ratul Thakur

это приложение с графическим интерфейсом или консольное приложение?
точка входа простого консольного приложения является основным() и интерфейс приложение Win32 функции WinMain()

и пожалуйста, проверьте свой вопрос, его главный, а не главный.
С уважением
Ратул

Miguel Altamirano Morales

Большое спасибо за ваш ответ, Ратул, и извините за мою грамматическую ошибку. Приложение представляет собой проект MFC, и теперь я знаю, что у него есть свой собственный стартовый класс. Я просто добился того, в чем нуждался.

2 Ответов

Рейтинг:
6

Sergey Alexandrovich Kryukov

Во-первых, обратитесь: Точка входа-Википедия, свободная энциклопедия.

Ваш вопрос предполагает, что ваша забота-это возвращение int ценность. Даже если это не так, знать, что он делает, - это хорошо.

Это в основном вопрос истории. Для функций начального уровня существует традиция возвращать 0 во всех случаях, кроме случаев аварийного завершения. Во всех (или почти во всех) ОС есть библиотеки, которые используются для проверки статуса процесса. Когда процесс завершается, ваш код может прочитать это значение из статуса. Кроме того, когда приложение выполняется синхронно в том или ином виде пакетного файла, команда запуска может вернуть это значение, которое может быть присвоено какой-либо переменной пакета / сценария, которая в дальнейшем может использоваться, например, для форк дальнейшее исполнение. В то же время это всего лишь традиция или культура, а не какой-то стандарт. Традиция возвращать 0 достаточно стабильна, а все остальные значения полностью зависят от приложения; если они необходимы, их можно описать в документации по конкретному приложению. Если использованная функция точки входа возвращает значение void, 0 все равно возвращается системе времени выполнения; это значение по умолчанию.

Со временем важность этой техники снижается; большинство приложений просто игнорируют возможность вернуть что-либо. Для этого есть две важные причины: структурная обработка исключений, затем графический пользовательский интерфейс и, в определенной степени, многопоточность. Ужасная техника возврата «статуса» из функции устранена; использовать это было бы просто глупо. Исключения намного мощнее. Обычно все приложения перехватывают все исключения во всех потоках и показывают гораздо более информативную диагностику проблем в самом приложении. Выбрасывание исключений в исполняющую систему, среду исполнения, относительно редко, используется только в простейшем приложении или указывает на низкотехнологичность. Более того, событийно-ориентированные UI-приложения (то есть почти все из них, если вы выбираете только достойные) улавливают все исключения в главном событии UI и сразу показывают диагностику проблемы.

—СА


Miguel Altamirano Morales

Большое вам спасибо, Сергей, и да, это хорошо и очень ценно-знать, что делает возвращаемое значение точки входа.
Моя очень подробная забота в том, что я делаю, заключается в том, чтобы знать правильный поток (или поток ?) выполнения этого приложения. Что мне нужно сделать, так это отобразить изображение, например полный портрет на экране, который должен появиться прямо перед первым диалоговым окном графического интерфейса. И я говорю GUI dialog, потому что теперь я вижу, что такого рода проекты не имеют windows forms.
Как вы и предполагаете, я не знаю, где отобразить этот портрет (PORTADA по-испански) или где включить его, чтобы он правильно отображался во время выполнения.

Miguel Altamirano Morales

Мне немного стыдно, потому что, возможно, я задаю очень наивный вопрос, особенно для таких людей, как вы, но, пожалуйста, поймите, что это мое самое первое свидание с родным проектом C++. Мне повезло, что я мог бы решить несколько вещей за две недели, но это становится все сложнее для меня с каждым днем. По крайней мере, я честно предупредил об этом своих клиентов.
Может быть, они наняли меня, потому что не могли найти никого другого, но я точно знаю, что получу то, что они хотят, мне просто нужно время для расследования.

Sergey Alexandrovich Kryukov

В этом вопросе нет ничего плохого. У нас есть много глупых вопросов, но они, как правило, глупы из-за логического противоречия, чаще всего неверных необоснованных предположений и неадекватных амбиций; другими словами, ложное знание глупо, но отсутствие знания-нет. Ваш вопрос не имеет ничего общего с этим; это естественно на определенном уровне обучения. Пожалуйста, не стесняйтесь спрашивать.

Вот в чем дело: ответ на ваш вопрос во многом зависит от 1) вашей конкретной платформы; 2) UI / графический фреймворк / библиотека, которую вы используете. Так что слишком подробный ответ не будет иметь смысла, пока вы не укажете это. Самый обычный подход таков: пользовательский интерфейс ориентирован на события; ОС предоставляет событие, используемое для обработки некоторого события отрисовки графики. Вы обрабатываете это событие, используете ссылку / указатель / обработчик графического контекста для рисования изображения или чего-то еще. ОС обеспечивает отсутствие избыточных вызовов. Например, если вы скрываете свое окно за каким-то другим окном или краем экрана, а затем показываете его снова, может сработать событие повторного рендеринга, но не при простом перемещении окна. Этот механизм может показаться слишком сложным, но это не так; это очень разумно и эффективно. Некоторые библиотеки могут делать это внутренне, поэтому вам нужно только поместить какой-нибудь объект в какой-нибудь контейнер, и тогда он будет отрисован. Кажется, это намного проще, но не обязательно лучше. Кроме того, современные библиотеки прозрачно используют аппаратное ускорение.

С этими намеками на фон вам нужно будет задать отдельный вопрос, как только вы предоставите необходимую информацию. Если вы хотите, чтобы я принял участие, пожалуйста, дайте мне ссылку на ваш новый вопрос, добавив комментарий к этому комментарию.

—СА

Miguel Altamirano Morales

Доброе утро, Сергей (сейчас 9: 14 утра в Мехико).

Платформа, с которой я работаю, - это Visual Studio 2010, приложение является родным C++, но я все еще не могу определить, что это за проект (если это MFC или Win32), но он генерирует файл .EXE, а не .DLL, хотя, похоже, у него есть классы MFC. Как я могу проверить это наверняка ?

О том, что вы просите для UI/graphics framework, я просто не знаю, Дайте мне посмотреть, смогу ли я решить эту проблему, и я вам расскажу.

Спасибо, Сергей.

Спасибо !!!

Sergey Alexandrovich Kryukov

Этого достаточно, спасибо.

В этой среде вы используете raw Windows API (возможно, с очень простой оболочкой MFC (см. документацию MFC: CImage), или комбинируя его с raw Windows API). Подход, который я описал в своем предыдущем комментарии, полностью применим. Роль обработчика событий играет ваш обработчик события WM_PAINT. Посмотрите документацию по этому событию и его обработке. См. также раздел методы Windows API Invalidate*..., для полноты картины.

Если вам нужна более подробная информация или вы не можете найти все концы, пожалуйста, напишите отдельный вопрос на отдельной странице вопроса. Вы можете дать мне ссылку на этот вопрос, комментируя этот комментарий; я постараюсь ответить быстро.

—СА

Miguel Altamirano Morales

Спасибо, я так и сделаю

Miguel Altamirano Morales

Это проект МФЦ, это факт.

Miguel Altamirano Morales

Вы не поверите: я уже решил проблему !!!.

Моя ошибка (Я считаю) заключается в том, что я думаю об этом приложении в терминах "потока" и "сети". Вы знаете: "где и когда я вставляю изображение".

Что я сделал, так это создал новое приложение с помощью мастера для проекта Win32 и увидел все файлы, которые он сгенерировал автоматически. Просмотрев их и "Readme. text", я получил хорошее представление о том, как это работает и что я должен считать точкой входа для приложения. Затем я заглянул в приложение, над которым работаю, и заметил, что это проект MFC, поэтому все зависит от файлов "nameofproject..h" и .cpp. Я только раскомментировал несколько строк, прокомментированных другим программистом, и включил заголовок и исходный файл для обработки класса.

Большое спасибо за вашу любезную поддержку, и я надеюсь, что мы сможем снова связаться, очень вероятно, что я продолжу исследования с помощью CodeProject, это очень ценный ресурс для программистов в процессе понимания, как я в этой конкретной теме (C++).

Благослови тебя Бог, Сергей.

Sergey Alexandrovich Kryukov

Добро пожаловать.
Удачи, звоните еще.
—СА

Karthik_Mahalingam

5

Рейтинг:
15

Jochen Arndt

С графическими приложениями Windows существует Точка входа WinMain (Windows)[^] (смотреть также Пошаговое Руководство: Создание Настольных Приложений Windows (C++)[^]). Это будет вызвано скрытым main реализация функции, которая добавляется в вашу программу при построении.

При создании приложения MFC даже WinMain реализация автоматически добавляется в вашу программу. Осуществление звонков InitInstance из ваших CWinApp производный класс, который затем является "видимой" точкой входа для приложений MFC.

Если вы собираетесь написать консольную программу Windows,вы должны реализовать основную функцию в стиле C/C++. Тем не менее, существуют специальные расширения Microsoft _tmain и wmain которые могут быть использованы вместо этого (они снова вызываются скрытой реализацией, которая обеспечивает преобразование между Unicode и многобайтовыми символьными строками). Смотреть также главная: запуск программы[^].


jeron1

Хороший пост. +5

Miguel Altamirano Morales

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

Я не видел раздела ответа на этот ответ, поэтому посылаю вам это сообщение, ожидая, что вы сможете его увидеть.

phil.o

Сделав комментарий к своему ответу или ответив на существующий комментарий, автор автоматически будет предупрежден о вашем сообщении; сначала в верхней строке на этом сайте, а затем по почте, если пользователь активировал эту опцию.
Итак, вы правильно ответили на замечание Мистера Арндта.

Jochen Arndt

Спасибо вам за ваши отзывы и принятие решения.

Как уже сказал Фил. О, вы ответили на мой ответ. При быстром ответе на вопросы и решения кнопка просто называется "задать вопрос или комментарий".