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

лекции / Shchupak_Yu._Win32_API_Razrabotka_prilozheniy_dlya_Windows

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

Содержание

11

 

 

Модель «клиент-сервер» ......................................................................

473

Обмен данными с помощью сообщения WM_COPYDATA .......................

474

Приложение ServerApp .........................................................................

475

Приложение ClientApp ..........................................................................

479

Не забывайте освобождать ресурсы ..........................................................

483

Когда многопоточность реально полезна? ................................................

484

Глава 10. Таймеры и время.....................................................

486

Время Windows..........................................................................................

486

Системное время .......................................................................................

487

Измерение малых временных интервалов .................................................

488

Использование счетчика монитора производительности ......................

488

Использование команды RDTSC............................................................

489

Программирование задержек в исполнении кода ......................................

497

Использование функции Sleep ..............................................................

498

Использование метода uDelay класса KTimer........................................

501

Класс QTimer ........................................................................................

502

Стандартный таймер .................................................................................

504

Первый способ использования стандартных таймеров .........................

504

Второй способ использования стандартных таймеров ..........................

508

Мультимедийный таймер...........................................................................

509

Функции timeSetEvent и timeKillEvent ....................................................

509

Тестирование мультимедийного таймера .............................................

511

Глава 11. Библиотеки динамической компоновки DLL ........

515

DLL и адресное пространство процесса .....................................................

514

Создание собственной DLL ........................................................................

517

Вызов функций из DLL ..............................................................................

519

Неявная загруза DLL.............................................................................

519

Явная загрузка DLL...............................................................................

521

Отложенная загрузка DLL .....................................................................

523

Загрузка ресурсов из DLL ..........................................................................

525

Функция входа/выхода ..............................................................................

527

Локальная память потока (TLS).................................................................

529

Динамическая TLS ................................................................................

531

Статическая TLS ...................................................................................

538

12 Содержание

Глава 12. Специальные приложения .....................................

539

Анимация ..................................................................................................

539

Приложение со стандартным таймером ................................................

539

Двойная буферизация ..........................................................................

543

Рисование в реальном времени .................................................................

547

Требования к приемнику информации от метеорадиолокатора ............

547

Разработка модели программного имитатора .......................................

548

Приложение 1. Интегрированная среда Visual C++ 6.0.......

563

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

563

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

565

Добавление к проекту файлов с исходным кодом.................................

566

Многофайловые проекты......................................................................

568

Компиляция, компоновка и выполнение проекта..................................

568

Конфигурация проекта .........................................................................

569

Как закончить работу над проектом .....................................................

569

Как открыть проект,

 

над которым вы ранее работали ......................................................

569

Встроенная справочная система ...........................................................

570

Работа с отладчиком ............................................................................

570

Некоторые полезные инструменты .......................................................

574

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

577

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

578

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

580

Компиляция, сборка и выполнение ...........................................................

582

Работа с редакторами ресурсов.................................................................

583

Приложение 3. Работа с утилитой Spy++ .............................

584

Список литературы ..................................................................

587

Алфавитный указатель ...........................................................

588

Предисловие

API — это аббревиатура названия Application Programming Interface (интерфейс при кладного программирования). API представляет собой совокупность функций и ин струментов, позволяющих программисту создавать приложения (программы), ра ботающие в некоторой среде.

Win32 API — это набор функций для создания программ, работающих под управ лением Microsoft Windows 98, Windows NT или Windows 2000. Все функции этого набора являются 32 битными, что отражено в названии интерфейса.

При написании прикладных программ для Windows программистам приходится пользоваться огромным объемом документации, который изложен в справочной си стеме MSDN, содержащей очень мало примеров и представленной только на анг лийском языке. Часто приходится тратить много времени, чтобы понять, как рабо тает та или иная функция, и какова область ее применения. Особенно серьезные проблемы возникают у разработчиков, имеющих поверхностные представления о принципах функционирования операционной системы и о механизмах ее взаимо действия с приложениями.

В данной книге изложены основные концепции и приемы программирования для Windows на языке C/C++ с применением Win32 API. Существенное внимание в ней уделяется вопросам взаимодействия операционной системы и приложений. Даны основы рисования и копирования изображений, а также использования Windows ресурсов. Рассмотрено создание графического интерфейса пользователя, включаю щего меню, панели инструментов, диалоговые окна и элементы управления. Также излагаются основы построения многопоточных приложений и библиотек динами ческой компоновки DLL. Рассмотрены специальные вопросы рисования: анимация, технология рисования в реальном времени. Показано использование классов C/C++ для применения концепций объектно ориентированного программирования при создании Windows приложений.

Владение базовыми знаниями интерфейса прикладного программирования су щественно облегчает изучение технологий программирования на более высоком уров не, например, с использованием библиотеки классов MFC (Microsoft Foundation Classes) или библиотеки классов Windows Forms.

Дело в том, что реализация как MFC, так и Windows Forms, основана на вызове функций Windows API. С точки зрения архитектуры эти интерфейсы представляют собой надстройку над Win32 API и предназначены для облегчения программирова ния Windows приложений. Однако практика показывает, что для программистов, начинающих писать программы сразу на уровне MFC или Windows Forms, возника ют серьезные проблемы, как только дело доходит до создания реальных приложе

14

Предисловие

 

 

ний. И, наоборот, если вы сначала приобретаете опыт программирования с Win32 API, освоение более высоких технологий проходит гораздо гармоничней и про дуктивней.

Есть и другой аспект, немаловажный для профессионального программирова ния. Очевидно, что MFC и Windows Forms не только повышают производитель ность труда программиста, но и обладают меньшей гибкостью по сравнению с ин терфейсом более низкого уровня. Поэтому когда к эффективности реализации приложения предъявляются повышенные требования (например, по затратам па мяти и быстродействию), более целесообразным является кодирование на уровне Win32 API.

На содержание книги повлияли:

информация, почерпнутая автором из книг таких мэтров Windows программи рования как Чарльз Петцольд (Charles Petzold) [1], Джеффри Рихтер (Jeffrey Richter) [5] и Фень Юань (Feng Juan) [6];

опыт практического программирования автора в ООО «Контур НИИРС»;

опыт проведения автором семинаров по программированию для Windows

в Санкт Петербургском государственном университете информационных тех нологий, механики и оптики.

Данная книга является вторым изданием, исправленным и дополненным, кни ги «Win32 API. Эффективная разработка приложений», опубликованной издатель ством «Питер» в 2006 г. В новой редакции книги добавлена глава, посвященная разработке DLL.

Кому адресована эта книга

Книга ориентирована на широкий круг читателей. Она будет полезна начина ющим программистам, студентам вузов, аспирантам и преподавателям, а также более опытным коллегам, владеющим языком C++, но не имеющим опыта разра ботки приложений для Windows.

Предполагается, что читатель знаком с языком C/C++ и умеет если не писать, то хотя бы читать и понимать программы, написанные на этом языке. Если это не так, то придется на время отложить эту книжку в сторону, пока вы не ликвидируе те этот досадный пробел в вашем образовании. Но не уходите надолго — книга будет вас ждать…:)

Как работать с книгой

Эта книга должна дать читателю базовые знания по программированию на C/C++ с использованием Win32 API. Конечно, для их усвоения недостаточно про сто прочитать изложенный здесь материал. Необходимо активное и глубокое по гружение в среду Win32 API, то есть выполнение большинства программных при меров на вашем компьютере.

Все приведенные в книге примеры протестированы на компьютере с операци онной системой Microsoft Windows 2000 Professional в среде Microsoft Visual Studio 6.0. Вы можете использовать любую из систем Windows 98, Windows NT/2000 или

Предисловие

15

 

 

Windows XP. Желательно компилировать приведенные примеры программ в Visual Studio 6.0, выполняя указания по построению проектов, приведенные в Прило жении 1.

Можно также компилировать проекты и в среде Microsoft Visual Studio.NET, но при этом надо точно выполнять требования к типу проекта, которые приведены в Приложении 2.

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

Программные примеры, рассмотренные в книге, содержат несколько классов и утилит общего назначения, которые вы можете применять и в своих приложени ях. Имена этих классов начинаются с буквы английского алфавита «K», чтобы не было путаницы с классами библиотеки MFC.

С целью сокращения объема книги во многих листингах программ повторяю щиеся фрагменты кода опущены, но делается ссылка на предшествующий листинг, содержащий этот фрагмент. Если у вас возникнут какие то вопросы в связи с эти ми ссылками, вы всегда сможете найти полные тексты программ в комплекте фай лов к данной книге, размещенном на сайте издательства «Питер».

В рамках одной книги невозможно осветить все аспекты программирования для Windows. Однако автор надеется, что после освоения базовых знаний вам будет гораздо легче разобраться с другими разделами программирования для Windows.

Автор будет признателен всем читателям за замечания, вопросы и пожелания, относящиеся к содержанию книги, которые можно присылать по адресу shupak@mail.ru.

От издательства

Ваши замечания, предложения и вопросы отправляйте по адресу электронной по чты comp@piter.com (издательство «Питер», компьютерная редакция).

Мы будем рады узнать ваше мнение!

Все исходные тексты, приведенные в книге, вы можете найти по адресу http:// www.piter.com/download.

Подробную информацию о наших книгах вы найдете на веб сайте издатель ства: http://www.piter.com.

16 Глава 1. «Hello, World!», или Первые шаги к пониманию концепции Windows

«Hello, World!»,

1или Первые шаги к пониманию основных

концепций Windows

Читатель, скорее всего, уже имеет опыт пользователя той или иной версии опера ционной системы Windows. Трудно предположить, что есть пользователь, который ни разу не работал с текстовым редактором Microsoft Word или с другим прило жением пакета Microsoft Office. Переход в категорию программиста требует, од нако, более близкого знакомства с внутренним устройством Windows. Поэтому, как бы ни хотелось нам поскорее откомпилировать код нашей первой программы, все же сначала придется поговорить об общих принципах функционирования опе рационных систем семейства Windows.

Базовые концепции

Операционная система Windows по сравнению с операционными системами типа MS DOS обладает серьезными преимуществами и для пользователей, и для про граммистов. Среди этих преимуществ обычно выделяют:

графический интерфейс пользователя;

многозадачность;

управление памятью;

независимость от аппаратных средств.

Графический интерфейс пользователя

Graphical User Interface1 (GUI) дает возможность пользователям работать с при ложениями максимально удобным способом. Каждое приложение представлено на экране дисплея своим окном, которое выглядит как прямоугольная рабочая область с набором стандартных элементов управления. Окно идентифицируется своим заголовком, имеет кнопки минимизации и максимизации размеров, а так же кнопку завершения приложения. Под заголовком обычно находится строка меню для выбора различных команд или режимов работы. Всплывающие окна

1 Графический интерфейс пользователя.

Базовые концепции

17

 

 

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

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

Многозадачность

Многозадачные операционные системы позволяют пользователю одновремен но работать с несколькими приложениями или несколькими копиями одного приложения. Например, пользователь может открыть Visual Studio 6.0 и наби рать в текстовом редакторе код одной из программ, приведенных в этой книге, одновременно слушая приятную музыку, воспроизводимую приложением «Про игрыватель Windows Media». В это же время программа explorer.exe может зани маться поиском необходимого файла по всему дисковому пространству компь ютера.

В первых версиях Windows была реализована так называемая кооперативная (или невытесняющая) многозадачность, когда приложения должны были сами отдавать управление операционной системе, чтобы дать возможность работать другим программам. Такая стратегия имела существенный недостаток, ведь лю бое некорректно работающее приложение могло «подвесить» операционную сис тему. Но уже в Windows 95 была введена вытесняющая многозадачность. Опера ционная система автоматически переключается с одной задачи на другую, не ожидая, пока выполняемая программа освободит управление процессором.

Многозадачность осуществляется в Windows при помощи процессов и потоков. Любое приложение Windows после запуска реализуется как процесс (process). Гру бо говоря, процесс можно представить как совокупность программного кода и вы деленных для его исполнения системных ресурсов. При инициализации процесса система всегда создает первичный (основной) поток (thread), который исполняет код программы, манипулируя данными в адресном пространстве процесса.

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

Но каковы соотношения между потоками и окнами? Дело в том, что окно все гда принадлежит некоторому потоку. Поток может быть владельцем одного или нескольких окон, а может быть и вовсе безоконным. Например, если вторичный поток создан для приема данных из COM порта, то он вполне может обойтись без своего окна.

18 Глава 1. «Hello, World!», или Первые шаги к пониманию концепции Windows

Наконец, сами окна, принадлежащие потоку, находятся в некоторых иерар хических взаимоотношениях. Одно окно является окном верхнего уровня (top level window)1, другие окна называются дочерними (child windows). Дочерние окна подчиняются своим родительским окнам (parent windows). Рисунок 1.1 иллюст рирует эти взаимоотношения.

Рис. 1.1. Соотношения между процессами, потоками и окнами

Если на экране находится несколько окон, то в каждый момент времени толь ко одно из них может быть активным. Активное окно отличается более ярким фоном на строке заголовка, в то время как пассивные окна имеют более тусклый фон заголовка. Говорят, что активное окно имеет фокус ввода. Это означает, что любая информация, вводимая пользователем при помощи клавиатуры или мыши, будет перенаправляться операционной системой именно данному окну.

Управление памятью

Память — это один из важнейших разделяемых ресурсов в операционной системе. Если одновременно запущены несколько приложений, то они должны разделять память, не выходя за пределы выделенного адресного пространства. Так как одни программы запускаются, а другие завершаются, то память фрагментируется. Си стема должна уметь объединять свободное пространство памяти, перемещая бло ки кода и данных.

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

1 Окно верхнего уровня не имеет родительского окна.

Базовые концепции

19

 

 

рые также называют отдельными экземплярами приложения, то система разме щает в памяти только одну копию исполняемого кода, которая используется этими экземплярами совместно. Программы, запущенные в Windows, могут ис пользовать также функции из других файлов, которые называются библиотека ми динамической компоновки — DLL (dynamic link libraries). Система Windows под держивает механизм связи программ во время их работы с функциями из DLL. Даже сама операционная система Windows, по существу, является набором ди намически подключаемых библиотек.

Механизмы управления памятью непрерывно совершенствовались по мере развития Windows. В данный момент Win32 API реализован для 32 разрядной операционной системы с плоским адресным пространством.

Независимость от аппаратных средств

Еще одним преимуществом Windows является независимость от используемой платформы. У программ, написанных для Windows, нет прямого доступа к аппаратной части таких устройств отображения информации, как, например, экран или принтер. Вместо этого они вызывают функции графической подсисте мы Win32 API, называемой графическим интерфейсом устройства (Graphics De vice Interface, GDI).

Функции GDI реализуют основные графические команды при помощи обра щения к программным драйверам соответствующих аппаратных устройств. Одна и та же команда (например, LineTo — нарисовать линию) может иметь различную реализацию в разных драйверах. Эта реализация скрыта от программиста, исполь зующего Win32 API, что упрощает разработку приложений.

Таким образом, приложения, написанные с использованием Win32 API, будут работать с любым типом дисплея и любым типом принтера, для которых имеется в наличии драйвер Windows. То же самое относится и к устройствам ввода дан ных — клавиатуре, манипулятору «мышь» и т. д. Такая независимость Windows от аппаратных средств достигается благодаря указанию требований, которым должна удовлетворять аппаратура, в совокупности с SDK (Software Development Kit — набор разработки программ) и/или DDK (Driver Development Kit — набор разработки драйверов устройств). Разработчики нового оборудования поставля ют его вместе с программными драйверами, которые обязаны удовлетворять этим требованиям.

Вызовы функций и DLL

Win32 API поддерживает вызовы свыше двух тысяч функций, которые можно использовать в приложениях. Все основные функции Windows объявлены в заго ловочных файлах. Главным заголовочным файлом является windows.h. В этом файле содержится множество ссылок на другие заголовочные файлы.

Вызовы функций Win32 API в программе осуществляются аналогично вы зовам библиотечных функций C/C++. Основное различие заключается в том, что компоновщик связывает код библиотечных функций C/C++ с кодом про граммы на этапе компоновки (статическое связывание), в то время как для функций Windows это связывание откладывается и осуществляется только

20 Глава 1. «Hello, World!», или Первые шаги к пониманию концепции Windows

на этапе выполнения программы (динамическое связывание). Библиотеки ди намической компоновки (DLL) содержатся в файлах с расширением .dll. Боль шая часть этих библиотек расположена в подкаталоге SYSTEM каталога уста новки Windows.

Операционная система позволяет компилятору использовать библиотеки им порта, поставляемые в составе используемой среды программирования. Библиоте ки импорта содержат имена всех функций из динамически подключаемых библио тек, а также ссылки на них. Используя эту информацию, компоновщик размещает в исполняемом файле таблицу, по которой в процессе загрузки программы настра иваются адреса вызываемых функций Win32 API.

Объектно-ориентированное программирование

Хотя формально операционная система Windows не является объектно ориенти рованной системой, тем не менее, в ней реализована именно объектно ориентиро ванная идеология. Это наиболее очевидно для базового объекта, с которым имеют дело и операционная система, и программист, и пользователь приложения, — то есть для окна.

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

Программист тоже рассматривает окна в качестве объектов, которые получа ют от пользователя информацию в виде оконных сообщений. Кроме этого окно обменивается сообщениями с другими окнами. Понимание этих сообщений — ключ к осмысленному программированию в среде Windows.

Можно привести и другие примеры объектов в Windows, к которым относятся, например, многочисленные графические объекты, используемые для рисования, такие как перья, кисти, шрифты, палитры и многие другие объекты.

Независимо от своего типа, любой объект в Windows идентифицируется сво им дескриптором, или описателем. Оба этих названия являются переводом анг лийского термина handle1. Дескриптор — это своего рода ссылка на объект. Все взаимоотношения программного кода с объектом осуществляются только через его дескриптор. Система Windows тщательно скрывает свои внутренние секреты и не допускает прямого доступа к внутренним структурам объекта.

Типы данных Win32

Программиста, пишущего на C/C++, первое знакомство с программой для Windows поражает обилием типов данных. На самом деле все они определены посредством директив #define или #typedef в заголовочных файлах Win32. В табл. 1.1 приведены некоторые наиболее часто встречающиеся типы данных Windows.

1 В среде программистов можно встретить еще один вариант «перевода» — хэндл.