Меню сайта
Главная
Общие сведения
Архитектура Windows
Программируем на vs.net
Студенческие заметки
Статьи
Контакты
Интернет магазин
Visual Studio 2008 Standard
Переход на Visual Basic .NET
Тестирование и отладка приложений в VB.NET
Поддержка и оптимизация на VB.NET
Создание наборов данных ADO.NET
Сопровождение Web-приложений в VB.NET
Введение в ADO.NET
Editor.NET
MemPort.NET
Управление автономными данными

Весь каталог

Новости
Макроподстановка ASSERT_VALID в отладочной (Debug) версии проекта проверяет на осмысленность полученный указатель и дает сообщение об ошибке, в случае когда указатель равен нулю или в действительности не является адресом объекта класса, производного от класса CObject. Если вы просмотрите иерархию классов MFC, то увидите, что CObject является отцом-прародителем всех классов, потомки которых использованы в нашем приложении. Подробнее "Классы приложения"
При создании нового проекта Studio.Net автоматически создает рабочее пространство и помещает в него этот проект. Вот перечень шагов для создания нового проекта и нового рабочего пространства (solution), его содержащего. Подробнее "Создание нового проекта"
Откройте файл ChildView.cpp, который содержит коды реализации методов класса CChildView. Его имя содержит ложный намек на происхождение от CView. На самом деле он происходит от класса CWnd и инкапсулирует функциональность окна, оккупирующего клиентскую область окна рамки, которое управляется классом CMainFrame. Простое окно, как вы помните, для перерисовки своего содержимого, вместо метода OnDraw использует метод OnPaint. Найдите этот метод в классе CChildView и убедитесь, что в нем контекст устройства создается, а не приходит в качестве параметра от каркаса приложения, как это было в приложениях, поддерживающих архитектуру документ — представление. Подробнее "Класс окна для отображения графика"
Установка параметрпв освещения осуществляется подобно тому, как это делалось в предыдущем уроке. Но здесь мы храним все параметры для тога, чтобы можно было управлять освещенностью изображения. Немного позже разработаем диалог, с помощью которого пользователь программы сможет изменять настройки освещения, а сейчас введите коды функции SetLight. Подробнее "Параметры освещения"
Картинная галерея

Общие сведения

Программируем на vs.net

Архитектура программного комплекса

Результаты взаимодействия Visual Studio

Реализация

Архитектура Windows

Солирование

Использование материалов

Причины возникновения

Методы

Партнеры проекта

Приложение на основе диалога

Уверен, что многие из читателей, разрабатывая свой код или запустив чужой многообещающий код, получали сообщение типа:

 

0xC000000S STATUS_ACCESS_VIOLATION

 

Раньше, во времена DOS, довольно часто можно было видеть сообщение «General Protection Fault» («Общая ошибка защиты»). Сообщения такого рода иногда вызывают чувство беспомощности и досады. Первая мысль — случилось что-то ужасное, вторая — неужели нельзя поподробнее объяснить причину отказа? Теперь, во времена COM (Component Object Model — Модель многокомпонентных объектов), количество ошибок и различного рода несоответствий драматически возрастает. В файле WinError.h, который можно найти в папке Include Visual Studio 6, содержатся описания свыше 1300 кодов ошибок, а в 7-й версии этот же файл содержит описания уже свыше 2500 кодов. Не будет преувеличением сказать, что не каждый разработчик будет с энтузиазмом искать файл WinError.h, а затем искать в нем код своей очередной ошибки.

 

Анализируя файл WinError.h, можно заметить, что есть две категории ошибок. Первая категория — коды \Win32-ошибок, которые имеют вид десятичного числа, например:

 

#define ERROR_ACCESS_DENIED 5L

 

Надеюсь, вы не забыли, что суффикс ' L' задает тип константы (long). Вторая категория — это коды ошибок, возвращаемых многими OLE- и СОМ-АР1-функци-ями, например:

 

#define E_NOTIMPL _HRESULT_TYPEDEF_(0x80004001L)

 

Последние имеют вид шестнадцатеричных чисел, которые хранятся в переменных типа HRESULT.

 

Примечание

Этот тип не является еще одним описателем (Handle), как может показаться, судя по его имени. Он определен в файле WTypes.h оператором эквивалентности typedef LONG HRESULT и используется как набор битовых полей, имеющих определенный смысл. Самым необычным в этой ситуации является то, что суть ошибки (ее текстовое описание), то есть то, что более всего интересует программиста, присутствуете файле WinError.h в виде комментария. Вот фрагмент файла, который описывает одну ошибку:

 

// Messageld: ERROR_FILE_NOT_FOUND

//

// MessageText:

//

// The system cannot find the file specified.

//

#define ERROR FILE NOT FOUND 2L

 

В файле есть несколько макроопределений, которые позволяют выделять некоторые параметры сообщения, но они не дают возможности программным способом выделить поле MessageText, так необходимое нам с вами. В файле приведены описания двух форматов кодов ошибок. Один из них определяет \¥ш32-ошибки, а другой — СОМ-ошибки. Оба имеют сходную структуру, но различаются в трактовке старших разрядов. Общее для них поле (Code) содержит относительный код или позицию ошибки в группе ошибок, связанных с той или иной ветвью в дереве Windows-технологий. Группы заданы кодом Facility. Например, группа, определяемая кодом Facility=3, объединяет ошибки работы с памятью, а группа Facility=17 объединяет все коды ошибок, которые могут возникнуть при использовании технологии СОМ+. Мощность множества вариаций атрибута Facility в версии Studio.Net 7.0 больше (23), чем в Visual Studio 6 (16), так как возросло количество поддерживаемых Windows технологий.

 

Таблица - Формат кода Win32-ошибок

 

 

31-30

29

28

27-16

15-0

 

 

Severity

С

R

Facility

Code

 

 

 

Таблица - Формат HRESULT СОМ-ошибок

 

31

30

29

28

27

15-0

26-16

S

R1

С1

N

r

Code

Facility

 

Символы имеют следующий смысл:

 

  • с — Customer code flag (флаг пользователя);

  • R — Reserved (зарезервировано для будущего использования);

  • s — Severity (Успех или неудача);

  • Rl, Cl, N, г — зарезервированная часть кода Facility.

 

Два старших бита Win32-oum6oK кодируют такие категории степени ошибки:

 

  • 00 —Success (Успех);

  • 01 — Informational (Информационное сообщение);

  • 10 — Warning (Предупреждение);

  • 11 — Error (Отказ).

 

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

 

  • создание приложения на основе диалога;

  • работа с текстовыми строками и потоками ввода-вывода, определенными в STL (Standard Template Library);

  • использование стандартного диалога по поиску папки; О поиск в реестре Windows.

 

Основная идея приложения заключается в том, что при его открытии происходит попытка с помощью реестра найти файл WinError.h, сканировать его и заполнить динамический контейнер структур с информацией обо всех ошибках. Далее пользователь имеет возможность либо просматривать информацию об ошибках, последовательно проходя по элементам контейнера, либо ввести код ошибки и увидеть результат его трансляции (расшифровки). Форматы битовых полей HRESULT подсказывают состав полей структуры, которую можно использовать для хранения информации об ошибке:

 

//====== Тип стуктур для описания ошибок

struct ErrorType

{

string Code;

// Код ошибки string Identifier;

// Ее идентификатор string Message;

// Текстовое описание

//======= Конструктор с параметрами

ErrorType(string с, string i, string m)

{

Code = c;

Identifier = i;

Message = m;

}

};

 

Так как мы собираемся использовать контейнер структур такого типа, то полезно определить новый тип:

 

typedef vector<ErrorType> ERROR_VECTOR;

 

Определения такого типа упрощают создание ссылок на контейнеры или на его составные части. Перед тем как мы приступим к разработке приложения, отметим, что MFC-приложения на основе диалога имеют некоторые преимущества перед другими типами приложений. Главным из них является простота структуры классов и возможность пользоваться глобальными функциями MFC для обмена данными между окнами и переменными диалогового класса. Надо признать, что Эти функции (типа DDX_— Dynamic Data Exchange И DDV_ — Dynamic Data Validation) очень удобны и надежны. Конечно, приложения рассматриваемого типа не обладают такими разнообразными возможностями, как приложения типа MDI (Multiple Document Interface), но для определенного класса задач они являются оптимальным выбором.

 

Начнем с создания стартовой заготовки приложения, основанного на диалоге. Тип приложения, как вы помните, выбирается с помощью мастера MFC Application Wizard. В левой части своего окна он имеет список команд, которые играют роль вкладок, раскрывающих различные окна-страницы правой части окна, поэтому команды слева мы будем называть вкладками, а окна справа — страницами. Для создания заготовки:

 

  • В меню File t New выберите команду Project.

  • В появившемся диалоге New Project, в окне Project Type раскройте ветвь дерева под именем Visual C++ Projects и выберите ветвь Win32 Projects.

  • В окне Templates выберите тип проекта: Win32 Project.

  • В окне Name задайте имя проекта: Look. В окне Location задайте или оставьте без изменения местоположение новой папки с файлами решения (solution).

  • В окне мастера MFC Application Wizard выберите вкладку Application Type и в окне справа укажите тип MFC-приложения — Dialog based.

  • Выберите вкладку User Interface Features и введите заголовок окна диалога — Look for an Error Code, так как английский язык в ресурсах работает значительно надежней русского, по крайней мере в бета-версии Studio.Net 7,0. Снимите флажок About — это упростит стартовое приложение.

  • Перейдите на страницу Advanced Features и снимите флажок ActiveX Controls.

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

  • Нажмите кнопку Finish. После непродолжительной паузы вы должны увидеть окно Solution Explorer.

 

Примечание

Если это (или какое-то другое) окно оказалось в режиме Auto Hide, а вам он не подходит, то надо сделать окно активным и вменю Window снять флажок с команды Auto Hide. Окно перейдет в режим Docable. Эти же действия надо проделать со всеми другими окнами студии, которые вы хотите поместить в блок страниц, открываемых вкладками. Любое окно можно также перевести в режим Floating и вытащить из блока страниц. Для того чтобы снова вставить его в блок, надо перевести его в режим Docable, «взять» за заголовок и указать его новое.место среди вкладок блока. Важно то, что указатель мыши должен находиться в этот момент в области ярлыков вкладок.

 

Запустите стартовую заготовку и убедитесь, что она создает диалог со значком, двумя кнопками и текстом «TODO:..» Раскройте окно Class View и найдите на его панели инструментов кнопку с подсказкой Class View Sort By. Опробуйте все способы сортировки содержимого окна Class View. Наиболее удобным является режим Sort By Type, однако для начинающих будет полезен режим более подробной демонстрации классов и методов (Sort Group By Type). Выберите этот режим и раскройте узел с именем класса CLookDlg. Этот класс, происходящий от класса coialog, выполняет функции главного окна приложения. Теперь раскройте узел Functions и дважды щелкните на конструкторе класса. Просмотрите коды конструктора и других методов класса.

 

Вставьте в начало файла LookDlg.h (после директивы #pragma) определение типа структур ErrorType, которое было рассмотрено выше. Перед тем как мы начнем вносить другие изменения, упростим заготовку. Функция OnPaint, реагирующая на сообщение WM_PAINT, обычно не используется в диалоговых окнах, так как элементы управления, которыми начинен диалог, нет необходимости перерисовывать. Их перерисовывает каркас приложения без нашего участия. Каждый элемент управления имеет свою, зарегистрированную системой, оконную процедуру, которая и выполняет перерисовку.

 

Однако в заготовке функция OnPaint присутствует, и она выполняет задачу, которая имеет малую важность, — перерисовывает значок на кнопке приложения (taskbar button) в его свернутом состоянии. Странным кажется тот факт, что пока мы-даже не можем свернуть окно. Вы заметили, что оно не имеет кнопки MinimizeBox, которая обычно располагается в правом верхнем углу окна. Запустите приложение и проверьте это. Сейчас мы исправим ситуацию, а заодно решим задачу со значком. Выполните следующие шаги для изменения класса CLookDlg:

 

  • Перейдите в окно Resource View, раскройте дерево ресурсов и дважды щелкните на идентификаторе диалога IDD_LOOK_DIALOG.

  • Откройте окно Properties, в разделе Appearance найдите свойство MinimizeBox и измените его значение на TRUE.

  • В окне Resource View, раскройте узел Icon, выберите идентификатор значка IDR_ MAINFRAME и нажмите клавишу Delete.

  • В окне редактора кодов (LookDlg.cpp) целиком удалите тела двух функций OnPaint, OnQueryDraglcon, два элемента карты сообщений: ON_WM_PAINT и ON_WM_QUERYDRAGICON и строку вызова Loadlcon из тела конструктора класса.

  • В файле LookDlg.h удалите объявления этих функций и переменную HICON m_hlcon.

 

Теперь в тело функции OnlnitDialog вместо двух строк:

 

SetIcon(m_hlcon, TRUE);

// Set big icon Setlcon(m_hlcon, FALSE);

// Set small icon

 

вставьте три строки, которые функционально заменяют весь тот код, который мы убрали. Функция Loadlcon загружает значок. Так как первый параметр функции задан равным нулю, то она не будет искать значок в ресурсах приложения, а возьмет стандартный (predefined) с идентификатором IDI_WINLOGO. Вы знаете, что символы «::», стоящие перед именем функции, означают, что эта функция является глобальной, то есть API-функцией. Эти символы можно и убрать, но тогда мы нарушим конвенцию (договоренность) об именах, существующую в сообществе программистов:

 

HICON hMylcon = ::Loadlcon(0,IDI_WINLOGO);

Setlcon(hMylcon, TRUE);

// Set big icon Setlcon(hMylcon, FALSE);

// Set small

 

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

Интернет магазин

 

1510 руб.

Переход на Visual Basic .NET

Слушатели курса познакомятся с различиями между Visual Basic 6.0 и Visual Basic .NET, а также с новыми возможностями Visual Studio .NET. Целевая аудитория: разработчики, имеющие опыт работы с предыдущими версиями Microsoft Visual Basic и желающие перейти на Microsoft Visual Basic .NET. 

Список версий:

Переход на Visual Basic .NET


1510 руб.

Тестирование и отладка приложений в VB.NET

На курсе обсуждаются методы тестирования и отладки программ, использование классов Debug и Trace из библиотеки классов .NET Framework, и работа с отладчиками из Visual Studio .NET и .NET Framework SDK. Целевая аудитория: Web-разработчики, желающие обновить свои знания и навыки в области тестирования и отладки приложений в среде Visual Studio .NET или подготовиться к сертификации MCAD или MCSD .NET. 

Список версий:

Тестирование и отладка приложений в VB.NET


 

  Все права защищены.
  Копирование запрещено.

Rambler's Top100
  Студия профессионального дизайна
  Дизайн: Студия Onta.ru