Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

лекции / Shchupak_Yu._Win32_API_Razrabotka_prilozheniy_dlya_Windows

.pdf
Скачиваний:
0
Добавлен:
11.02.2026
Размер:
13.15 Mб
Скачать

Запуск 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. Если же внут

Запуск IDE. Типы приложений

573

 

 

ренняя работа функции вас не интересует, а нужен только результат ее выполне ния, то надо нажать клавишу F10.

Допустим, что вы вошли в тело функции func1(), нажав клавишу F11, но через некоторое время, пройдя несколько строк кода, решили выйти из функции. В этом случае надо нажать клавиши Shift+F11.

Существует и другая возможность пропустить пошаговое выполнение неко торого фрагмента программы. Надо установить текстовый курсор в нужное место программы и нажать клавиши Ctrl+F10.

Продолжим отладку программы Buggy. Нажмите клавишу F10. Указатель сле дующей выполняемой команды переместится на следующий оператор:

sum += a[i];

Проверка значений переменных во время выполнения программы

Чтобы узнать значение переменной sum, в которой будет накапливаться сумма элементов массива a, задержите над ней указатель мыши. Рядом с именем пере менной на экране появляется подсказка со значением этой переменной:

sum = -1.07374e+008

Ага!!! Ведь еще не было никакого суммирования, и, следовательно, перемен ная sum, по идее, должна быть равна нулю. Вот в чем дело! Мы забыли обнулить переменную sum до входа в цикл.

Нажмите комбинацию клавиш Shift+F5, чтобы выйти из отладчика и испра вить найденную ошибку. Найдите строку с о следующим объявлением:

float sum, average;

Добавьте в нее инициализацию переменной sum:

float sum = 0, average;

Откомпилируйте заново проект при помощи кнопки Build (F7) и запустите его кнопкой Execute Program (Ctrl+F5). В результате будет отображен новый результат:

average = 2.8

Уже теплее, но все равно еще неправильно. Нажмите любую клавишу для за вершения работы приложения. Необходимо продолжить отладку.

Установите точку прерывания перед оператором for и запустите программу в отладочном режиме, нажав клавишу F5. Теперь нажмите клавишу F10. Указатель следующей выполняемой команды переместится на следующий оператор:

sum += a[i];

Нажмите клавишу F10, и указатель переместится на следующий оператор:

for (i = 1; i < N; i++)

Задержите теперь над переменной sum указатель мыши. Рядом с именем пере менной появится подсказка со значением этой переменной:

sum = 2.

Стоп!!! Позади первая итерация цикла, и в переменной sum должно находить ся значение первого элемента массива a, то есть число 1. А мы получили число 2, то есть значение второго элемента массива a. Пришло время вспомнить, что в языке C++ нумерация элементов массива начинается с нуля. Поэтому ошибка находит ся в заголовке цикла:

for (i = 1; i < N; i++)

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, вполне обоснованным будет ваше желание проверить, а все ли с этим указателем в порядке?

Счастливого плавания!

577

Приложение 2

Интегрированная среда

Visual Studio.NET

Мы предполагаем, что пакет Microsoft Visual Studio.NET уже установлен на ва шем компьютере. Работа в IDE Visual Studio.NET имеет много общего с работой в IDE Visual Studio 6.0, описанной в приложении 1. Но в то же время имеются отличия как в интерфейсе пакета, так и в используемой терминологии.

В этом приложении описываются шаги по созданию нового проекта типа Win32 Application – empty project, компиляции, сборке и выполнению приложе ния.

После запуска Visual Studio.NET главное окно программы имеет вид, показан ный на рис. П2.1. В зависимости от настроек для вашего пакета Visual Studio.NET вид главного окна может несколько отличаться от того, который показан на ри сунке.

Рис. П2.1. Главное окно (рабочий стол) Visual Studio.NET

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.

580

Приложение 2. Интегрированная среда VisualStudio.NET

 

 

Рис. П2.6. Окно после выбора пункта Application Settings

Рис. П2.7. Окно Visual Studio.NET после создания нового проекта

Создание нового проекта завершено.

Откроем папку проекта HelloFromMsgBox, чтобы посмотреть на служебные файлы, созданные мастером. Обратите внимание на два файла. Файл HelloFromMsgBox.sln — это файл «решения» (рабочей области), а HelloFromMsgBox.vcproj — это файл проекта. Таким образом, расширение .slnздесь используется вместо расширения .dswдля Visual C++ 6.0 и, соответственно, расширение .vcproj — вместо расширения .dsp.

Добавление к проекту нового файла

Чтобы добавить к проекту новый файл, нужно выполнить простую последова тельность действий. Сначала щелкните правой кнопкой мыши на пиктограмме