Форум программистов, компьютерный форум CyberForum.ru

CLI и GUI приложение - в чем разница? - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Написать функцию, определяющую среднюю месячную заработную плату рабочего http://www.cyberforum.ru/cpp-beginners/thread1094749.html
кому не сложно сделайте задачу не успеваю немного Написать функцию, определяющую среднюю месячную заработную плату рабочего, если известно его заработная плата за каждый месяц. Необходимые функции: • ввод данных; • вывод массива данных; • проверка правильности введенных данных; • вычисления суммы заработной платы; • вычисления среднего значения заработной платы;
C++ Ошибка pow: DOMAIN error При запуске в C++ Builder функция спамит вышеуказанной ошибкой, в выводе все значения при (i-j)<0 забиты значением INF, при (i-j)>0 выводятся числа, но весьма далёкие от верных результатов. Пробовал обойти через ab=eln(a)*b и через a-b=1/ab, но результаты выдаёт схожие. Подскажите нубу, в чём может быть проблема. void Matrix (TMatr a) { int i,j; for (i=0;i<n;i++) for (j=0;j<n;j++) ... http://www.cyberforum.ru/cpp-beginners/thread1094743.html
Как пропарсить строку типа "43/12" C++
как пропарсить строку типа "43/12", причем 43 и 12 интовые поля, а / - charовское.
Создать класс “Квартира”, состоящей из класса ”Жильцы” C++
Создать класс “Квартира”, состоящей из класса ”Жильцы”. Класс “Квартира”: улица, номер, телефон. Класс “Жильцы”: Фамилия, год рождения, пол. Вывести всех пенсионеров и их местожительство.
C++ Вывести график функции в консоли http://www.cyberforum.ru/cpp-beginners/thread1094706.html
Здравствуйте. Я пишу программу. Нужно вывести график функции в консоли. Помню, писал на Dev-C++ это. Там был хедер graphics.h(простой был. Писать на нем - одно удовольствие). В VS я не нашел. Есть какой-то GdiPlusGraphics.h. Но это, походу, не то. Какими средствами можно написать программу? Чтобы было красиво и "писабельно".
C++ Что такое #, include, что это означает ______ подробнее

Показать сообщение отдельно
Ilot
Модератор
Эксперт С++
1765 / 1140 / 221
Регистрация: 16.05.2013
Сообщений: 3,017
Записей в блоге: 5
Завершенные тесты: 1
12.02.2014, 08:48     CLI и GUI приложение - в чем разница?
Вот в догонку вырезка из Рихтера. Подробности у него же.
Кликните здесь для просмотра всего текста

Windows поддерживает два типа приложений: основанные на графическом интерфейсе (graphical user interface, GUI) и консольные (console user interface, CUI). У приложений первого типа внешний интерфейс чисто графический. GUI-приложения создают окна, имеют меню, взаимодействуют с пользователем через диалоговые окна и вообще пользуются всей стандартной "Windows'oвской" начинкой. Почти все стандартные программы Windows — Notepad, Calculator, Wordpad и др. — являются GUI-приложениями. Приложения консольного типа работают в текстовом режиме: они не формируют окна, не обрабатывают сообщения и не требуют GUI. И хотя консольные приложения на экране тоже размещаются в окне, в нем содержится только текст. Командные процессоры вроде Cmd.exe (в Windows 2000) или Command.com (в Windows 98) — типичные образцы подобных приложений.

Вместе с тем граница между двумя типами приложений весьма условна. Можно, например, создать консольное приложение, способное отображать диалоговые окна. Скажем, в командном процессоре вполне может быть специальная команда, открывающая графическое диалоговое окно со списком команд, вроде мелочь — а избавляет от запоминания лишней информации. В то же время можно создать и GUI-приложение, выводящее текстовые строки в консольное окно. Я сам часто писал такие пpoграммы: создав консольное окно, я пересылал в него отладочную информацию, связанную с исполняемым приложением. Но, конечно, графический интерфейс предпочтительнее, чем старомодный текстовый. Как показывает опыт, приложения на основе GUI "дружественнее" к пользователю, а значит и более популярны.

Когда Вы создаете проект приложения, Microsoft Visual C++ устанавливает такие ключи для компоновщика, чтобы в исполняемом файле был указан соответствующий тип подсистемы. Для CUI-программ используется ключ /SUBSYSTEM:CONSOLE, а для GUI-приложений — /SUBSYSTEM:WINDOWS. Когда пользователь запускает приложение, загрузчик операционной системы проверяет номер подсистемы, хранящийся в заголовке образа исполняемого файла, и определяет, что это за программа — GUI или СUI. Если номер указывает на приложение последнего типа, загрузчик автоматически создает текстовое консольное окно, а если номер свидетельствует о противоположном — просто загружает программу в память. После того как приложение начинает работать, операционная система больше не интересуется, к какому типу оно относится.

Во всех Windows-приложениях должна быть входная функция за реализацию которой отвечаете Вы. Существует четыре такие функции:

C++
1
2
3
4
5
6
7
int WINAPI WinMain( HINSTANCE hinstExe, HINSTANCE, PSTR pszCmdLine, int nCmdShow);
 
int WINAPI wWinMain( HINSTANCE hinstExe, HINSTANCE, PWSTR pszCmdLine, int nCmdShow);
 
int __cdecl main( int argc, char *argv[], char *envp[]);
 
int _cdecl wmain( int argc, wchar_t *argv[], wchar_t *envp[]);
На самом деле входная функция операционной системой не вызывается. Вместо этого происходит обращение к стартовой функции из библиотеки С/С++. Она инициализирует библиотеку С/С++, чтобы можно было вызывать такие функции, как malloc и free, а также обеспечивает корректное создание любых объявленных Вами глобальных и статических С++-объектов до того, как начнется выполнение Вашего кода. В следующей таблице показано, в каких случаях реализуются те или иные входные функции.
//------------------Тут как бы таблица----------------//
Тип приложения
Входная функция
Стартовая функция, встраиваемая в Ваш исполняемый файл

GUI-приложение, работающее с ANSI-символами и строками
C++
1
2
 WinMain 
 WinMainCRTStartup
GUI-приложение, работающее с Unicode-символами и строками
C++
1
2
 wWinMain 
 wWinMainCRTStartup
CUI-приложение, работающее с ANSI-символами и строками
C++
1
2
 main 
 mainCRTStartup
CUI-приложение, работающее с Unicode-символами и строками
C++
1
2
 wmain 
 wmainCRTStartup
//------------------Тут как бы она заканчивается----------------//

Нужную стартовую функцию в библиотеке С/С++ выбирает компоновщик при сборке исполняемого файла. Если указан ключ /SUBSYSTEM:WINDOWS, компоновщик ищет в Вашем коде функцию WinMain или wWinMain. Если ни одной из них нет, он сообщает об ошибке "unresolved external symbol" ("неразрешенный внешний символ"); в ином случае — выбирает WinMainCRTStartup или wWinMainCRTStartup соответственно.

Аналогичным образом, если задан ключ /SUBSYSTEM:CONSOLE, компоновщик ищет в коде функцию main или wmain и выбирает соответственно mainCRTStartup или wmainCRTStartup; если в коде нет ни main, ни wmain, сообщается о той же ошибке — "unresolved external symbol".

Но не многие знают, что в проекте можно вообще не указывать ключ /SUBSYSTEM компоновщика. Если Вы так и сделаете, компоновщик будет сам определять подсистему для Вашего приложения. При компоновке он проверит, какая из четырех функций (WinMain, wWinMain, main или wmain) присутствует в Вашем коде, и на основании этого выберет подсистему и стартовую функцию из библиотеки С/С++.

Одна из частых ошибок, допускаемых теми, кто лишь начинает работать с Visual С++, — выбор неверного типа проекта. Например, разработчик хочет создать проект Win32 Application, а сам включает в код функцию main. При его сборке он получает сообщение об ошибке, так как для проекта Win32 Application в командной строке компоновщика автоматически указывается ключ /SUBSYSTEM:WlNDOWS, который требует присутствия в коде функции WinMain или wWinMatn. В этот момент раз работчик может выбрать один из четырех вариантов дальнейших действий:

заменить main на WinMain. Как правило, это не лучший вариант, поскольку разработчик скорее всего и хотел создать консольное приложение;
открыть новый проект, на этот раз — Win32 Console Application, и перенести в него все модули кода. Этот вариант весьма утомителен, и возникает ощущение, будто начинаешь все заново;
открыть вкладку Link в диалоговом окне Project Settings и заменить ключ /SUBSYSTEM:WINDOWS на /SUBSYSTEM:CONSOLE. Некоторые думают, что это единственный вариант;
открыть вкладку Link в диалоговом окне Project Settings и вообще убрать ключ /SUBSYSTEM:WINDOWS. Я предпочитаю именно этот способ, потому что он самый гибкий. Компоновщик сам сделает все, что надо, в зависимости от входной функции, которую Вы реализуете в своем коде. Никак не пойму, почему это не предлагается по умолчанию при создании нового проекта Win32 Application или Win32 Console Application.
 
Текущее время: 03:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru