лекции / Shchupak_Yu._Win32_API_Razrabotka_prilozheniy_dlya_Windows
.pdf
Запуск IDE. Типы приложений |
571 |
|
|
Чтобы не отвлекаться на детали реализации Windows приложений, построим нашу демонстрационную программу как консольное приложение. Консольные приложения выглядят подобно программам, написанным в среде MS DOS.
Для создания подобного проекта нужно сначала выполнить команду меню File New…. После этого нужно перейти на вкладку Projects диалогового окна New. На этой вкладке надо выбрать тип Win32 Console Application, ввести имя проекта
втекстовом поле Project Name, указать имя каталога для размещения файлов в поле Location и нажать кнопку OK.
Назовем нашу программу именем Buggy. Программа должна вычислять сред нее арифметическое первых пяти натуральных чисел. Нетрудно догадаться, что
витоге должно получаться число 3, однако из за специально сделанных ошибок программа сначала будет выдавать неправильный ответ1.
Для построения программы создайте проект типа «консольное приложение» с именем Buggy и добавьте к проекту файл buggy.cpp со следующим текстом:
#include <iostream.h> int main() {
const N = 5;
int a[N] = {1, 2, 3, 4, 5}; float sum, average;
int i;
for (i = 1; i < N; i++) sum += a[i];
average = sum / N;
cout << "average = " << average << endl; return 0;
}
Откомпилируйте проект и запустите его. В консольном окне приложения бу дет выведено нечто вроде следующего результата:
average = -2.14748e+007
Программа вычислила, что среднее арифметическое первых пяти целых чисел равно –21 474 800 (на вашем компьютере может быть и другое число), а это мало похоже на число 3.0. Теперь можно начать отладку нашей злополучной программы.
Установка точки прерывания
Точка прерывания позволяет остановить выполнение программы перед любой вы полняемой инструкцией, чтобы продолжать выполнение программы либо в поша говом режиме, либо в непрерывном режиме до следующей точки прерывания.
Чтобы задать точку прерывания перед некоторым оператором, необходимо ус тановить перед ним текстовый курсор и нажать клавишу F9 или щелкнуть мышью на кнопке Insert/Remove BreakPoint на панели инструментов Build MiniBar. Точка пре рывания обозначается в виде коричневого кружка на левом поле окна редактирова ния. Повторный щелчок на указанной кнопке снимает точку прерывания. В про грамме может быть несколько точек прерывания.
Выполнение программы до точки прерывания
Программа запускается в отладочном режиме с помощью команды меню Build Start Debug Go. В результате код программы выполняется до той строки, на которой
1Пожалуйста, закройте глаза на ошибки, если вы сразу увидите их в тексте программы. Приводи мый пример несложен и предназначен только для изучения возможностей отладчика.
572 |
Приложение 1. Интегрированная среда Visual C++ 6.0 |
|
|
установлена точка прерывания. Затем программа останавливается и отображает в окне Editor ту часть кода, где находится точка прерывания. Причем желтая стрелка на левом поле указывает на строку, которая будет выполняться на следующем шаге отладки.
Продолжим демонстрацию описываемых средств на примере программы Buggy. Установите точку прерывания перед оператором for и запустите программу в от ладочном режиме, нажав клавишу F5.
Обратите внимание на то, что меню Build заменилось на меню Debug. Вид глав ного окна Visual Studio в этот момент показан на рис. П1.5. Стрелка на левом поле окна редактора указывает на инструкцию for, и отладчик остановился перед ее выполнением.
Среди различных команд меню Debug особый интерес представляют коман ды Step Into (F11), Step Over (F10), Step Out (Shift+F11), Run To Cursor (Ctrl+F10) и Stop Debugging (Shift+F5). Выполнение последней команды вызывает заверше ние работы с отладчиком.
О дополнительных окнах отладчика, расположенных в нижней части главного окна Visual C++, мы поговорим попозже.
Рис. П1.5. Меню Debug и дополнительные окна отладчика
Пошаговое выполнение программы
Нажимая клавишу F10, можно выполнять один оператор программы за другим. Предположим, что при пошаговом выполнении программы вы дошли до строки, в которой вызывается некоторая функция func1(). Если вы хотите посмотреть, как работает код вызываемой функции, то надо нажать клавишу F11. Если же внут
574 |
Приложение 1. Интегрированная среда Visual C++ 6.0 |
|
|
Эту ошибку нужно немедленно исправить. Повторите действия для исправле ния ошибки. Надо выйти из отладчика и исправить текст программы в операторе for:
for (i = 0; i < N; i++)
Теперь проект надо заново откомпилировать и запустить. Если в процессе ис правления вы не внесли новых ошибок, то должен получиться результат
average = 3.0.
Итак, программа работает правильно.
В заключение отметим, что отладчик предоставляет и другие возможности для наблюдения за значениями переменных во время выполнения программы.
Îêíà Variables è Watch
Когда программа запускается в отладочном режиме, отладчик выводит два до полнительных окна для наблюдения за значениями переменных (см. рис. П1.5). Эти два окна размещаются ниже окна Editor, но выше окна Output. Окно Variables располагается слева, а окно Watch находится справа. Они могут быть спрятаны или вызваны на экран при помощи команды меню View Debug Windows.
На вкладке Auto окна Variables отображаются значения последних переменных, с которыми работал Visual C++. В верхней части окна Variables находится окно раскрывающегося списка Context, об использовании которого будет сказано ниже.
В окне Watch на любой из вкладок можно задать имя переменной, за текущими значениями которой вы хотите понаблюдать.
Более подробную информацию о работе с этими окнами вы можете найти в справочной системе через меню Help главного окна Visual C++.
Некоторые полезные инструменты
IDE Microsoft Visual C++ 6.0 содержит много удобных средств, облегчающих раз работку программ. К ним относятся, в частности, редакторы ресурсов, работа с которыми рассматривается в главах 5 и 7. Из других инструментов большую пользу могут принести команда Find in Files и окно Context со списком нескольких последних вызовов функций.
Команда «Find in Files»
Доступ к команде Find in Files обеспечивает кнопка на панели инструментов, пока занная на рис. П1.6.
Рис. П1.6. Кнопка Find in Files
Допустим, вы хотите найти все вхождения в файлы вашего проекта какого либо имени. Наведите текстовый курсор на интересующее вас имя и нажмите кнопку Find in Files. Появится диалоговое окно Find in Files, в котором текстовое поле уже будет содержать интересующее вас имя. Вы можете дополнительно взве сти флажки Match whole word only (искать только отдельные слова) и/или Match case (искать с учетом регистра букв). После этого остается нажать кнопку Find, и вы сразу получите в окне Output полный список вхождений заданного имени по всем файлам проекта.
Запуск IDE. Типы приложений |
575 |
|
|
Попробовав один раз, вы уже не сможете отказаться от регулярного обще ния с этим инструментом, ведь он так облегчает повседневную жизнь програм миста!
Îêíî Context
Наиболее неприятной для программиста является ситуация с неожиданным кра хом программы, при котором система выводит диалоговое окно с текстом «Access Violation». Это значит, что в результате какой то ошибки ваша программа попыта лась обратиться к недоступному для нее адресу оперативной памяти.
Окно Context, находящееся в верхней части окна Variables (см. рис. П1.5) и пред ставляющее собой раскрывающийся список, помогает программисту в таких си туациях быстро локализовать то место в программе, которое явилось причиной возникновения нештатной ситуации. В этом окне содержится список нескольких последних вызовов функций перед фатальным концом работы.
В этом окне надо найти самый последний вызов, который принадлежит ваше му исходному коду. Если щелкнуть мышью по этому элементу списка, то стрелка на левом поле окна редактора укажет на строку программы, содержащую «крими нальный» вызов. Далее — уже дело техники (или аналитической работы ваших серых клеточек), чтобы сообразить, что же у вас «не так, как надо…».
Рассмотрим простой пример. Довольно частой ошибкой является использова ние указателя, для которого не выделена требуемая память, чтобы хранить значе ние соответствующего типа. Предположим, что в групповом проекте использует ся некий класс A, разрабатываемый двумя программистами1. Допустим, что в классе A имеется член со следующим определением:
RECT* pRect;
Предположим далее, что первый программист, кодирующий конструктор клас са A, забыл выделить память для указателя pRect. А в это время второй програм мист, разрабатывающий метод Show, будучи уверенным, что память уже выделена, напишет следующий фрагмент:
void A::Show() {
int x0 = pRect->left; int y0 = pRect->top;
}
Все! «Аннушка уже пролила масло…»
Любая программа, использующая объект класса A, при вызове метода Show за вершится необработанным исключением (unhanded exception), о чем сообщает окно примерно такого вида (рис. П1.7).
Рис. П1.7. Печальная весть о кончине программы
1Мы здесь абстрагируемся от рекомендаций по надлежащей организации групповой разработки про екта и от рекомендаций по стилю кодирования. Нарушение этих рекомендаций как раз и является питательной средой для появления ошибок того типа, который мы рассматриваем.
576 |
Приложение 1. Интегрированная среда Visual C++ 6.0 |
|
|
Однако если вы запустили приложение с такой ошибкой в отладочном режи ме (F5), то после щелчка на кнопке OK отладчик показывает картинку, приведен ную на рис. П1.8.
Рис. П1.8. Информация в окне Context, помогающая локализовать место краха программы
Последним вызовом функций в списке, который показывает окно Context, яв ляется вызов метода A::Show(). Цветная стрелка на левом поле окна редактора по казывает инструкцию, при выполнении которой и случилось наше несчастье. Так как в этой инструкции используется указатель pRect, вполне обоснованным будет ваше желание проверить, а все ли с этим указателем в порядке?
Счастливого плавания!
578 |
Приложение 2. Интегрированная среда VisualStudio.NET |
|
|
Конечно, уже сейчас можно найти первые отличия от Visual Studio 6.0.
Окно Project Workspace переместилось от левого края к правому краю главно го окна и изменило свое название. Теперь оно называется Solution Explorer.
На месте окна Editor появилось окно с вкладками, которое сначала содержит только одну страницу StartPage. По мере построения проекта в этом окне могут появляться и другие страницы.
Таким образом, термином «Решение» теперь называется то, что раньше назы валось «Рабочей областью». «Решение» также может содержать несколько про ектов, но все наши программные примеры содержат ровно один проект.
Окно Output осталось на том же месте и по прежнему служит для вывода сооб щений о ходе компиляции, сборки и выполнения программы.
Создание нового проекта
Для создания нового проекта типа Win32 Application — empty project нужно выпол нить следующую последовательность действий. Сначала надо выполнить коман ду меню File New Project. Это приведет к отображению окна New Project, пока занного на рис. П2.2.
Ðèñ. Ï2.2. Îêíî New Project
Всписке Project Types следует открыть папку Visual C++ Project. Окно New Project
примет вид, показанный на рис. П2.3.
Всписке подтипов для Visual C++ Project выберите пиктограмму папки Win32. Окно New Project примет вид, показанный на рис. П2.4.
Вокне Templates надо выделить шаблон Win32 Project. Затем надо указать имя проекта в текстовом поле Name, например, HelloFromMsgBox. Также введите имя папки для размещения проекта в поле Location, например, E:\MyProject. После на жатия кнопки OK будет отображено окно Win32 Application Wizard – HelloFromMsgBox
(рис. П2.5).
Создание нового проекта |
579 |
|
|
Рис. П2.3. Окно New Project после раскрытия папки Visual C++ Project
Рис. П2.4. Окно New Project после выбора папки Win32
Ðèñ. Ï2.5. Îêíî Win32 Application Wizard – HelloFromMsgBox
Щелкните мышью на пункте Application Settings. Окно мастера примет вид, по казанный на рис. П2.6.
В группе флажков Additional options установите флажок Empty project и нажми те кнопку Finish. Окно Visual Studio.NET примет вид, показанный на рис. П2.7.
