- •Материал к курсам «Объектно-ориентированное программирование», «Инструментальные средства визуального программирования» и «Современные технологии и инструментарий программирования»
- •8. Интерфейс графического устройства, цвет и шрифт 71
- •10. Консольные приложения Windows 91
- •21. Алгоритмы 220
- •22. Профилирование программы в Microsoft Visual Studio 6.0 238
- •23. Некоторые функции api Win32 240
- •24. Разное-всякое 247
- •Часть2.Технология сом 299
- •Предисловие автора
- •1.3.Работа со строками
- •1.3.1.Кодировки и кодовые страницы
- •1.3.2.О кодировке Unicode
- •1.3.3.Использование класса cString
- •1251 (Cyrillic (Windows) ) в кодировку 866 (Cyrillic dos).
- •1.3.4.Некоторые полезные функции класса cString
- •1.4.Явное преобразование типов
- •1.4.1.Преобразование полиморфных типов dynamic_cast
- •1.4.2.Преобразование неполиморфных типов static_cast
- •1.4.3.Преобразование reinterpret_cast
- •2.Соглашения об именах
- •3.Пространства имен
- •4.Макросы и отладка
- •4.1.Макрос trace
- •4.2.Объект afxDump
- •4.3.Классы cDumpContext и cObject
- •4.5.Макрос assert_valid
- •4.6.Макрос verify
- •4.7.Автоматическая диагностика неуничтоженных объектов
- •5.Каркас приложений mfc
- •5.1.Понятие каркаса приложений
- •Каркас приложений и библиотека классов
- •Пример на базе каркаса приложений
- •5.2.Сопоставление сообщений в библиотеке mfc
- •5.3.Документы и их представление
- •5.4.Функции взаимодействия «документ-вид»
- •5.5.Простейшее приложение на базе архитектуры «документ-вид»
- •5.6.Усложненное взаимодействие «документ-вид»
- •6.Класс «вид» библиотеки mfc (версия mvs 6.0)
- •6.1.Что такое «вид»
- •6.2.Интерфейсы sdi и mdi
- •6.3. Сценарий создания приложения drw в ис mvs 6.0
- •6.4.Класс cdrwView
- •6.5.Рисование внутри окна представления: Windows gdi
- •Функция-член OnDraw
- •Контекст устройства в Windows
- •Добавление кода рисования в программу drw
- •6.6.Первое знакомство с редакторами ресурсов
- •Содержимое файла drw.Rc
- •Работа с редактором диалоговых окон
- •6.7.Конфигурации Win32 Debug и Win32 Release
- •6.8.Активизация диагностических макросов
- •6.9.Предкомпилированные заголовочные файлы
- •6.10.Два способа запуска программы
- •7.Класс «вид» библиотеки mfc (версия mvs 2005)
- •7.1.Что такое «вид»
- •7.2.Интерфейсы sdi и mdi
- •7.3. Сценарий создания приложения с архитектурой документ-вид в среде mvs 2005
- •7.4.Класс cdrwView
- •7.5.Рисование внутри окна представления: Windows gdi
- •Функция-член OnDraw
- •Контекст устройства в Windows
- •Добавление кода рисования в программу drw
- •7.6.Конфигурации Win32 Debug и Win32 Release
- •7.7.Активизация диагностических макросов
- •7.8.Два способа запуска программы
- •8.Интерфейс графического устройства, цвет и шрифт
- •8.1.Классы контекста дисплея cClientDc и cWindowDc
- •8.2.Создание и уничтожение cdc-объектов
- •8.3.Состояние контекста устройства
- •8.4.Класс cPaintDc
- •8.5.Объекты gdi
- •8.6.Создание и уничтожение gdi-объектов
- •8.7.Управление gdi-объектами
- •8.8.Стандартные gdi-объекты
- •8.9.Время жизни контекста устройства
- •9.1.Приложение, основанное на диалоговом окне
- •9.2.Приложение без поддержки архитектуры документ-вид
- •9.3.Приложение с поддержкой архитектуры документ-вид
- •9.4.Краткая характеристика базовых классов класса вид
- •9.4.1.Класс cView
- •9.4.2.Класс cFormView
- •9.4.3.Класс cHtmlView
- •9.4.4.Класс cListView
- •9.4.5.Класс cRichEditView
- •9.4.6.Класс cScrollView
- •9.4.7.Класс cTreeView
- •10.2.Создание консоли
- •10.3.Закрытие консоли
- •10.4.Дескрипторы консоли
- •10.5.Входной буфер консоли
- •10.6.Буферы дисплея консоли
- •10.7.Размер буфера окна и дисплея
- •10.8.Скроллинг дисплейного буфера
- •10.9.Методы ввода/вывода в консольных приложениях
- •10.10.Режимы консоли
- •10.11.Высокоуровневый консольный ввод/вывод
- •10.12.Высокоуровневые режимы консоли
- •10.13.Высокоуровневые функции ввода и вывода консоли
- •10.15.Низкоуровневые режимы консоли
- •10.16.Низкоуровневые функции ввода консоли
- •10.14.Низкоуровневые функции ввода и вывода консоли
- •10.17.Низкоуровневые функции вывода консоли
- •10.18.Кодовые страницы в консольных приложениях
- •10.19.Пример консольного приложения ColorRusConsole
- •10.20.Использование графики в консольных приложениях
- •10.21.Изменение заголовка окна приложения и его прятание
- •11.Архитектура документ-вид и диалоговое окно
- •11.1.Как получить доступ к документу из диалогового окна
- •11.1.1.Первый способ
- •11.1.2.Второй способ
- •11.2.Как получить доступ к представлению из диалогового окна
- •11.3.Отображение данных в управляющих элементах диалогового окна и их получение (mvs 6.0)
- •11.4.Создание оконных подклассов для расширенного управления вводом данных
- •12.Обработка файлов
- •12.1.Обработка текстовых файлов (mvs 6.0)
- •12.2.Обработка текстовых файлов (mvs 2005)
- •12.3.Обработка двоичных файлов
- •12.4.Поиск файлов и каталогов по заданному пути и маске
- •12.5.Диалоги по выбору имени файла и каталога
- •13.Обработка сообщений Windows
- •13.1.Обработка сообщений в рамках одного приложения
- •13.2.Об обработке команд
- •13.3.Обработка сообщений в рамках системы
- •14.Разработка и использование собственных dll
- •14.1.Основы dll
- •14.1.1.Согласование импортируемых элементов с экспортируемыми
- •14.1.2.Явное и неявное связывание
- •14.1.3.Связывание по символьным именам против связывания по порядковым номерам
- •14.1.4.Точка входа в dll: функция DllMain
- •14.1.5.Описатели экземпляров и загрузка ресурсов
- •14.1.6.Порядок поиска dll клиентской программой
- •14.1.7.Отладка dll
- •14.1.9.Общие dll mfc-библиотеки
- •14.1.10.Dll-расширения: экспорт классов
- •14.1.11.Последовательность поиска ресурсов в dll-расширении
- •14.2.Разработка библиотеки
- •14.3.Разработка клиентского приложения, использующего библиотеку dll
- •15.Обработка растровых изображений
- •16.Обработка исключительных ситуаций
- •If (блок будет работать)
- •16.1.Введение в обработку исключительных ситуаций
- •16.2.Синтаксис обработки исключительных ситуаций
- •16.3.Синтаксис инициирования исключительных ситуаций
- •16.4.Примеры генерации и обработки исключительных ситуаций
- •17.Классы
- •17.1.Пример класса tVector
- •17.2.Класс tVector с перегруженными операциями
- •18.Шаблоны классов
- •18.1.Пример шаблона класса
- •18.2.Шаблон класса tVector
- •19.Стандартная библиотека, библиотеки mfc и atl
- •19.1.Состав стандартной библиотеки
- •19.2.Библиотеки mfc и atl
- •20.Коллекции
- •20.1.Обзор коллекций mfc
- •20.2.Шаблонные классы коллекций mfc
- •20.3.Использование массивов, списков и ассоциативных массивов
- •20.3.1.Использование простых массивов и списков
- •20.3.2.Члены класса cArray
- •Конструкторы
- •Атрибуты
- •Обработка
- •Доступ к элементам
- •Увеличение размера массива
- •Вставки и удаления
- •Операции
- •20.3.3.Члены класса cList
- •Параметры
- •Возвращаемое значение
- •Замечания
- •Параметры
- •Возвращаемое значение
- •20.3.4.Использование простых ассоциативных массивов
- •20.4.Использование шаблонов коллекций типизированных указателей
- •20.4.1.Использование массивов и списков типизированных указателей
- •20.4.2.Использование типизированных указателей на ассоциативные массивы
- •20.5.Использование контейнера vector
- •20.5.1.Конструкторы
- •Пример использования конструкторов
- •20.5.4.Иллюстрация использования класса vector
- •21.Алгоритмы
- •21.1.Общие соглашения
- •21.2.Итераторы
- •21.3.Функциональные объекты
- •21.4.Распределители
- •21.5.Состав библиотеки алгоритмов
- •21.6.Немодифицирующие алгоритмы
- •21.7.Пример использования шаблонной функции sort() из библиотеки алгоритмов
- •21.8.Сортировка массива объектов пользовательского класса
- •21.9.Еще одна иллюстрация некоторых алгоритмов на примере обработки числового массива
- •22.Профилирование программы в Microsoft Visual Studio 6.0
- •23.Некоторые функции api Win32
- •23.1.Получение информации о компьютере и операционной системе
- •23.1.1.Функция GetLogicalDrives
- •23.1.2.Функция GetDriveType
- •23.1.3.Функция GetDriveType
- •23.1.4.Функция GetDiskFreeSpaceEx
- •23.1.5.Функция GlobalMemoryStatus
- •23.1.6.Функции GetComputerName, GetUserNameA
- •23.1.7.Функции GetSystemDirectory, GetTempPath, GetWindowsDirectory, GetCurrentDirectory
- •23.1.8.Функция GetSystemInfo
- •24.Разное-всякое
- •24.1.Русификация приложений
- •24.2.Помощь и всплывающие подсказки
- •24.3.Использование ini-файла
- •24.3.1.Ansi-версия программы для среды mvs 6.0.
- •24.3.2.Unicode-версия программы для ис mvs-2005 и mvs-2008.
- •24.3.3.Ansi-версия программы для ис mvs-2005.
- •24.3.4.Ansi-версия программы для ис mvs-2008
- •24.4.Установка размеров и положения главного окна-рамки приложения
- •24.5.Создание дополнительного потока в консольном приложении
- •24.6.Интеллектуальные указатели
- •24.7.Управление формой курсора мыши
- •24.8.Как выйти из длительного цикла
- •24.9.Получение изображения содержимого окна
- •Сохранение изображения в файле
- •0, // Первая строка развертки, которая должна
- •0, // Число копируемых линий
- •Int I; // Количество выбираемых линий
- •0, // Первая строка развертки, которая должна быть выбрана
- •0, // Число копируемых линий
- •0, // Первая выбираемая линия для изображения назначения
- •0, // Режим использования
- •24.10.Подстройка очертания окна под контур изображения
- •24.11.Как корректно завершить приложение с графическим интерфейсом из него самого
- •24.12.Обработка ошибок ввода
- •25.Интегрированная среда Microsoft Visual Studio 2005
- •25.1.Терминология
- •25.2.Свойства решения и проекта
- •25.3.Что обозначают иконки на вкладке Class View
- •26.О справочной системе msdn версий 6.0 и 2005
- •26.1.Примеры приложений (версия 6.0)
- •26.2.Учебные пособия (tutorials)
- •26.3.Примеры приложений из msdn-2005
- •26.3.1.Примеры приложений mfc (mfc samples)
- •27.Процессы и потоки
- •27.1.Основные понятия Понятие приложений, процессов и потоков
- •Текущие диск и каталог для процесса
- •Определение версии системы
- •Когда полезно создавать потоки
- •Когда многопоточность неэффективна
- •Механизм многопоточности Windows
- •Приостановка, возобновление и переключение потоков
- •Приостановка и возобновление процессов
- •27.2.Функция потока
- •Функция CreateThread
- •Завершение потока
- •Часть2.Технология сом
- •28.Краткий обзор концепций программирования
- •29.Обзор технологии .Net и c#
- •29.1.Введение
- •29.2.Характеристика платформы .Net Framework
- •Среда разработки: Microsoft Visual Studio
- •Язык f#
- •29.3.Пример консольного приложения
- •29.4.Класс стек на основе связного списка
- •29.5.Чтение текстового файла
- •30.Предпосылки возникновения com
- •31.Межпроцессное взаимодействие
- •34.Введение в com технологии
- •34.1.Основные понятия и определения
- •34.2.Технология com как спецификация и реализация
- •34.3.Составляющие приложений com
- •35.Способы реализации сом серверов
- •35.1.Виды серверов и их основные характеристики
- •35.2.Алгоритм взаимодействия клиента с внутрипроцессным сервером
- •Последовательность действий при вызове клиентом внутрипроцессного сервера.
- •Последовательность действий при вызове клиентом локального или удаленного сервера
- •36.Интерфейсы
- •37.Доступ к серверу с помощью пользовательских интерфейсов
- •38.Доступ к серверу с помощью интерфейса iDispatch
- •38.1.Сценарий для версии mvs 6.0
- •38.2.Сценарий для версии mvs 2005
- •38.3.Доступ к серверу Excel в mvs 2005 с помощью диспетчерского интерфейса
- •39.Применение интеллектуальных указателей для доступа к серверам
- •39.1.Импорт библиотеки типов
- •39.2.Доступ к серверу SolidWorks 2003 с помощью интеллектуальных указателей
- •39.3.Доступ к серверу SolidWorks 2007 с помощью интеллектуальных указателей
- •39.4.Доступ к серверу Microsoft Word с помощью интеллектуальных указателей из консольного приложения
- •39.5.Доступ к серверу Microsoft Word с помощью интеллектуальных указателей из gui-приложения
- •40.Внедрение и связывание объектов
- •40.1.Понятие внедрения и связывания объектов
- •40.2.Серверы и контейнеры
- •41.Обработка ошибок
- •41.1.Функция SetErrorMode – управление реакцией программы на ошибочные состояния
- •41.2.Функции GetLastError и SetLastError – получение кода ошибки и его установка
- •41.3.Коды ошибок hresult
- •41.4.Получение текстов сообщений об ошибках
- •42.Типы данных сом
- •42.1.Типы данных методов и свойств сом объектов
- •43.Приложения
- •43.1.Словарь терминов
- •43.2.О регистрации внутрипроцессного сервера сом
- •5. Степанов а., Менг Ли. Руководство по стандартной библиотеке шаблонов (stl)/ Пер. На русский а.Суханова и а.Кутырина – м.: 1999.
- •Список литературы по платформе .Net
- •9. Дон Бокс, Крис Селлз. Основы платформы .Net, том 1. Общеязыковая исполняющая среда /Пер. С англ. – м.; сПб.: к.: Издательский дом "Вильямс", 2003. – с.288. Isbn 5-8459-0455-2
- •10. Деймьен Уоткинз, Марк Хаммонд, Брэд Эйбрамз. Программирование на платформе .Net среда /Пер. С англ. – м.; сПб.: к.: Издательский дом "Вильямс", 2003. – с.368. Isbn 5-8459-0456-0
- •11. Джеффри Рихтер. Clr via c#. Программирование на платформе Microsoft .Net Framework 2.0 на языке c#. Мастер-класс / Пер. С англ. – м.:Издательство «Русская редакция»; сПб.: Питер, 2007. - 656с.
- •12. Джеффри Рихтер. Программирование на платформе Microsoft .Net Framework / Пер. С англ. – м.:Издательско-торговый дом «Русская редакция», 2003 - 512с.
- •14. Пауэрс Ларс, Майкл Снелл. Microsoft Visual Studio 2008 / Пер. С англ. — сПб.:
- •Список литературы по технологии сом
- •13. Дейл Роджерсон. Основы сом/Пер. С англ.–2-е изд., исправл. И дополн.–м,:Изд.-торг. Дом «Русская редакция».–2000, 400с.
- •15. Дэвид Чеппел. Технология ActiveX и ole/ Пер. С англ. – м.: Издательский отдел "Русская редакция" тоо "Channel Traiding Ltd.", 1999. – 320с.
- •16. Бокс д. Сущность технологии сом. Библиотека программиста. — сПб.: Питер, 2001. — 400 с.: ил. (Есть в электронном формате)
- •17. К. Таваре, к. Фертитта, б. Ректор, к. Селлз. Библиотека atl 8: внутренняя структура и применение. Microsoft Visual Studio 2005. – м.; сПб.:, к.: Издательский дом "Вильямс", 2007, 736с.
Предисловие автора
Часть 1 этого документа относится как к курсу «Инструментальные средства визуального программирования» и «Современные технологии и инструментарий программирования», так как в ней не затрагивается технология СОМ. Ранее конспект лекций по курсу «Инструментальные средства визуального программирования» (читается с осени 2008г. для 3-го курса) я распространял в файле с именем ISVP_Lec.doc, но с декабря 2008г. я его прекращаю обновлять. Весь материал, который прежде был в файле ISVP_Lec.doc, теперь присутствует в этом файле.
Часть 2 этого документа относится в основном к курсу «Современные технологии и инструментарий программирования» (читается для 5-го курса), так как в ней освещается технология СОМ. Ранее конспект лекций по этому курсу я распространял в файле с именем VCLectures.doc, но с декабря 2008г. я его прекращаю обновлять и далее размещаю новый материал в этом документе и в него же вношу исправления. Весь материал, который прежде был в файле VCLectures.doc, теперь присутствует в этом файле.
Теперь о версиях Microsoft Visual Studio. По состоянию на декабрь 2008г. весь материал относился к версии Microsoft Visual Studio 6.0. Далее, т.е. с января 2009г., в рамках курса «Современные технологии и инструментарий программирования» предполагается переход на версию Microsoft Visual Studio 2005. Так как и в рамках версии Microsoft Visual Studio 2005 пока предполагается разрабатывать приложения без использования Microsoft .NET Framework, то излагаемый материал практически инвариантен по отношению к версиям Microsoft Visual Studio. Фактически, отличия начинаются только там, где речь идет не о языке, а об интегрированной среде Microsoft Visual Studio. Я постараюсь подчеркивать эти отличия, но не могу гарантировать что у меня хватит терпения и внимания к отслеживанию всех отличий.
С осени 2011г. в рамках курса «Инструментальные средства визуального программирования» используется версия Microsoft Visual Studio 2008, она же будет использоваться и в курсе «Современные технологии и инструментарий программирования». Отличия версии 2008 от 2005 менее существенны, чем отличия 2005 от MVS 6.0.
С осени 2015г. в рамках курсов «Объектно-ориентированное программирование», «Инструментальные средства визуального программирования» используется версия Microsoft Visual Studio 2010, она же будет использоваться и в курсе «Современные технологии и инструментарий программирования». Отличия версии 2010 от 2008 не очень существенны.
С уважением В.Н.Овсянник
Часть 1. Программирование на Visual C++
1.Классификация и характеристика типов данных C++
1.1.Классификация типов данных C++
В настоящее время (2008г.) действует стандарт языка С++ ISO/IEC 14882, утвержденный рабочей группой JTC1/SC22/WG21. Он был опубликован впервые в 1998г. и доработан в 2003г. Неформально этот стандарт известен как C++98. Рабочая группа WG21 в настоящее время (осень 2008г.) работает над новой версией стандарта, которую предполагается опубликовать в 2009г. под предварительным именем (label в оригинале) C++0x. Далее в этом документе под стандартом языка будет подразумеваться именно C++98.
Классификация типов данных стандарта языка С++ представлена на рис.1.
|
Рис. 1. Классификация типов данных языка С++
Фундаментальные типы называют еще базовыми или основными. Тип void (пустой) является специфическим в том смысле, что данных этого типа не существует и не может быть, но, вместе с тем, можно описать указатель на тип void, который будет «указателем вообще» (как тип pointer в языке Паскаль), т.е. не будет ассоциирован с каким-либо конкретным типом, имеющим диапазон значений и др. атрибуты. Если тип функции описан как void, то это значит, что функция не возвращает никакого значения, т.е. является процедурой по терминологии языка Паскаль или Subroutine в языке Fortran.
1.2.Краткая характеристика типов данных C++
В табл. 1 приведены характеристики типов данных языка C++ (стандарт С++ и версия С++, используемая в MVS-2005).
Таблица 1
Характеристики типов данных стандарта С++ и для компилятора MVS-2005
Имя типа |
Байт |
Другие имена |
Диапазон значений |
Примечание |
Булевский тип |
||||
bool |
* |
- |
false, true |
1 байт в MVS-2005 |
Символьные типы |
||||
char |
1 |
signed char |
–128..127 |
|
unsigned char |
1 |
- |
0..255 |
|
wchar_t |
2 |
__wchar_t, WCHAR (в Windows) |
0..65535 |
для задания констант этого типа надо использовать префикс L, например, L’a’, L”abc” |
Целочисленные типы |
||||
int |
* |
signed, signed int |
Зависит от ОС |
4 байта в MVS-2005 |
unsigned int |
* |
unsigned |
Зависит от ОС |
4 байта в MVS-2005 |
__int8 |
1 |
char, signed char |
–128..127 |
Специфично для MS |
__int16 |
2 |
short, short int, signed short int |
–32 768..32 767 |
-//- |
__int32 |
4 |
signed, signed int |
–2 147 483 648..2 147 483 647 |
-//- |
__int64 |
8 |
- |
-9 223 372 036 854 775 808 .. 9 223 372 036 854 775 807 |
-//- |
short |
* |
short int, signed short int |
Зависит от ОС
|
2 байта в MVS-2005 –32 768..32 767 |
unsigned short |
* |
unsigned short int |
Зависит от ОС
|
2 байта в MVS-2005 0..65 535 |
long |
* |
long int, signed long int |
Зависит от ОС
|
4 байта в MVS-2005 –2 147 483 648..2 147 483 647 |
unsigned long |
* |
unsigned long int |
Зависит от ОС
|
4 байта в MVS-2005 0..4 294 967 295 |
long long |
8 |
signed long long int |
-9 223 372 036 854 775 808 .. 9 223 372 036 854 775 807 |
Специфично для MS |
unsigned long long |
8 |
unsigned long long int |
0..18446744073709551615 |
Специфично для MS |
Перечисления |
||||
enum |
* |
- |
Такой же, как и int |
|
Вещественные типы |
||||
float |
4 |
- |
3.4E-38.. 3.4E+38 (7 значащих цифр) |
|
double |
8 |
- |
1.7E-308..1.7E+308 (15 значащих цифр) |
|
long double |
10 |
- |
1.2E-4932..1.2E+4932 (19 значащих цифр) |
в MVS-2005 трактуется как double, но типы double и long double все же разные |
Символ * в столбце таблицы «байт» означает, что размер памяти, занимаемый типом данных, в стандарте языка не определен. Касательно интегральных и вещественных типов в стандарте языка заданы следующие соотношения:
1==sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(float) <= sizeof(double) <= sizeof(long double)
При этом не предполагается, что символьный тип char действительно занимает 1 байт памяти – просто его размер принимется за единицу.
Как видно из таблицы, взятой из MSDN MVS-2005, в Visual C++ начиная с версии 5.0 тип bool имеет размер 1 байт, в то время как в предыдущих версиях он занимал столько же байт памяти, сколько и тип int.
Данные типа long double в системах Windows NT и Windows 95 преобразуются к типу double.
Модификаторы signed и unsigned могут применяться к любому интегральному типу. Тип char по умолчанию знаковый, но его можно сделать беззнаковым с помощью ключа компилятора /J. Этот ключ (J – прописная буква!) надо указывать, как и другие ключи, в поле Project Options на вкладке C/C++ окна Project Settings, вызываемого с помощью команды Project|Project Settings.
Типы int и unsigned int имеют размер, зависящий от системы: 2 байта в MS-DOS и 16-битовых версиях Windows и 4 байта в 32-битовых ОС. Таким образом, чтобы программный код был переносимым, он не должен зависеть от размера типа int. Это значит, например, что нигде в программе Вы не должны предполагать, что тип int имеет размер 2, 4 или 16 байт. Более того, как и во многих других случаях, Вам удастся избежать многих неприятностей, если Вы вообще не будете использовать в программе «магические» числовые константы. Например, в нынешнее время тип char занимает пока еще 1 байт памяти, но, очевидно, совсем скоро он станет (по умолчанию!) занимать два байта в связи с повсеместным распространением кодировки Unicode. То же относится и к другим типам. Например, в версии компилятора Borland C++ 3.1 тип int занимает два байта памяти, а в Visual C++ 6.0 и MVS-2005 – уже четыре байта.
В файле Limits.h определены константы, задающие предельные значения для интегральных типов. Смотрите.
В Windows SDK и MFC определены и используются и другие многочисленные имена как для базовых типов, так и для производных (см. раздел этого документа «Соглашения об именах», а также раздел MSDN “Windows Data Types”). Имена типов, определенные в Windows, записываются с использованием заглавных букв, например, TCHAR, BOOL, BOOLEAN и т.п.
