Основы организации операционных систем Microsoft Windows

Разработка Win32 приложений. Инструментальные средства изучения системы

Разбить на страницы
Показывать лекцию целиком

Win32 API

Уже отмечалось, что в ОС Windows между приложением и совокупностью системных вызовов (системных сервисов в терминологии Microsoft) расположен дополнительный абстрактный слой - программный интерфейс Win32 API. За счет этого Win32-приложение может работать практически во всех версиях Windows (см. рис 1.5), несмотря на то, что сами системные вызовы в различных версиях системы различны и не документированы.

Исчерпывающая информация по программному интерфейсу Win32 API содержится в справочной документации на Win32 API. Эту документацию можно просмотреть на сайте http://msdn.microsoft.com или на компакт-дисках MSDN (Microsoft Developer Network Library). MSDN является программой технической поддержки разработчиков.

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

Если заглянуть в раздел MSDN \Platform SDK\ Win32\ Overview of the Win32 API, то можно увидеть, что Win32 API подразделяются на следующие группы.

  • Base Services - базовые сервисы отвечают за обеспечение доступа к ресурсам компьютера и интерфейс для работы с памятью, файлами, устройствами, процессами и потоками.
  • Common Control Library - библиотека общих элементов управления для разработки оконных интерфейсов.
  • Graphics Device Interface - вывод графики на дисплей и другие устройства.
  • Network Services - сетевые сервисы.
  • User Interface - интерфейс пользователя.
  • Windows Shell - функции для работы с оболочкой.
  • Windows System Information - информация о конфигурации системы Windows.
  • В рамках данного курса нам потребуются главным образом функции, относящиеся к первому пункту списка и описанные в MSDN разделе \Platform SDK\Base Services, а также функции, описанные в разделе \Platform SDK\ Security.

    Компилятор Visual C++ и среда программирования для Windows

    Предполагается, что читатель знаком с типичными приложениями Windows, такими, как Проводник (Windows Explorer), ориентируется в файловой системе компьютера и в состоянии найти любой файл, записанный на жестком диске.

    Компилятор Windows Visual C++ удобно объединять со справочной системой MSDN Library, которая при этом вызывается через пункт меню "Справка" ("Help") в интегрированной среде Microsoft Visual C++, а также может использоваться автономно. Запуск установленной графической оболочки Microsoft Visual C++ осуществляется стандартными средствами системы.

    Чтобы из текста программы на языке высокого уровня (файл с расширением "c" или "cpp") получить исполняемую программу в машинных кодах (файл с расширением "exe"), необходимо в графической оболочке Microsoft Visual Studio C++ создать рабочий проект, который представляет собой совокупность служебных файлов, необходимых для дальнейшей работы.

    Программные примеры, иллюстрирующие данный курс, представляют собой Windows-приложения с текстовым интерфейсом (консольные). Разработка приложений с дружественным графическим интерфейсом сама по себе достаточно сложна и должна изучаться в рамках специальных учебных курсов. Поэтому, формируя проект, далее в графической оболочке Visual Studio в диалоговом окне "New" нужно выбрать Win32 Console Application в качестве типа приложения, а также дать проекту имя, указать каталог расположения файлов проекта и нажать кнопку "OK".

    Затем при помощи пунктов меню и всплывающих окон графической оболочки нужно включить в проект файлы, содержащие программу, или ввести программу с клавиатуры с последующим ее сохранением в одном из файлов проекта. Через пункт меню "Build" можно выполнить компиляцию программы, создать исполняемый модуль, запустить программу на счет и, при необходимости, выполнить ее отладку. Существует большое количество разнообразных руководств по использованию Microsoft Visual Studio C++.

    Прогон программы "Hello, world"

    В качестве самостоятельного упражнения рекомендуется реализовать простейшую программу в интегрированной среде компилятора Visual C++, например, хрестоматийную программу "Hello, world", и ознакомиться со средствами разработки, отладки и контекстной помощи.

    Типы данных, используемые в Win32-приложениях

    Мобильность программ и их независимость от конкретной платформы во многом обеспечивается введением новых стандартных типов данных - определенных на основе простых типов языка программирования Си. Имена стандартных типов данных состоят из символов верхнего регистра, для них не применяется оператор "*".

    Полный перечень используемых данных можно увидеть в разделе \Plarform SDK \Win32 API\ Reference \ Data Types. Ниже приведен список наиболее распространенных типов: симовольных, целых, булевских, указателей и описателей (handles). Символьные, целые и булевские типы соответствуют аналогичным типам большинства диалектов языка Си. Имена типов-указателей содержат префикс "P" или "LP". Описатели имеют отношение к ресурсам, загруженным в память.

    Наиболее часто используются следующие типы данных:

  • BOOL - булевская переменная ( TRUE или FALSE );
  • CHAR - 8- разрядный символ;
  • DWORD - 32-разрядное беззнаковое целое;
  • HANDLE - описатель объекта;
  • INT - 32-разрядное целое;
  • LPSTR - указатель на строку 8-разрядных символов, заканчивающуюся нулем;
  • LPTSTR - LPWSTR в случае Unicode или LPSTR в случае ANSI;
  • LPVOID - указатель на любой тип;
  • LPWSTR - указатель на строку 16-разрядных (Unicode) символов, заканчивающуюся нулем;
  • TCHAR - WCHAR, в случае Unicode или CHAR в случае ANSI;
  • WCHAR - 16-разрядный Unicode символ;
  • WORD - 16-разрядное беззнаковое целое.
  • Остальные типы данных будут изучаться по мере необходимости. Некоторые Win32 приложения могут быть выполнены в среде более ранних версий ОС Windows, в том числе и 16-разрядных. Вследствие этого имена некоторых типов отражают систему адресации ОС MS-DOS, например, LP (long pointer) означает "длинный" указатель, а на самом деле - это обычный указатель.

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

    Unicode

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

    Стандарт Unicode поддерживается консорциумом, в который входят такие компании, как Apple, Compaq, Hewlett-Packard, IBM, Microsoft и многие другие; подробная информация об этом имеется на сайте http://www.unicode.org. В справочнике MSDN соответствующие сведения хранятся в разделе \Visual Studio documentation\ Visual C++ Programmer's Guide \ Adding Program Functionality \ Overviews \ Unicode Programming.

    Для совместимости со стандартами языков программирования и предыдущими версиями Windows в системе наряду с 16-битными (двухбайтовыми) символами активно используются и 8-битные (однобайтовые) ANSI символы. Так, многие Win32-функции , принимающие строковые параметры, существуют в двух версиях: для Unicode и для ANSI. Обычно при вызове ANSI-версии Win32-функции входные строковые параметры перед обработкой системой преобразуются в Unicode. В связи с этим перед разработчиками стоит задача написания приложений, способных работать с обеими кодировками.

    Разработка приложений с использованием Unicode

    Чтобы снизить зависимость приложения от используемой кодировки, целесообразно в программе определить два макроса - UNICODE и _UNICODE. Также рекомендуется использовать новый набор данных и функций, обрабатывающих строки и описанных в стандартных заголовочных файлах.

    Обычно, имена Unicode данных и функций содержат префикс "wc" (от wide character), "w". Например, WCHAR - Unicode символ, wcscmp - функция сравнения Unicode строк. Можно также поставить префикс "L" перед текстовой строкой, например, L"Текстовая строка" - строка в формате Unicode.

    Чтобы реализовать возможности компиляции двойного назначения, нужно включить в состав программы заголовочный файл tchar.h. Он состоит из макросов, которые ссылаются на Unicode данные и функции, если в программе определен макрос .

    Прогон программы вывода строки в формате Unicode

    В качестве упражнения рекомендуется реализовать программу вывода строки "Hello, world".

    #define UNICODE
    #ifdef UNICODE
    #define _UNICODE
    #endif
    #include <windows.h>
    #include <tchar.h>
    #include <stdio.h>
    
    void main() {
    PTCHAR TextString = _T("Hello, world");
    _tprintf(_T("String -  %s\n"), TextString);
    }

    Необходимо убедиться, что программа одинаково работает в случае применения и отключения Unicode.

    Прогон программы записи в файл в Unicode и обычном формате

    Приведенная программа может вывести строку "Hello, world" в файл MyFile.txt в обычном формате и в формате Unicode.

    #define UNICODE
    #ifdef UNICODE
    #define _UNICODE
    #endif
    #include <windows.h>
    #include <tchar.h>
    #include <stdio.h>
    
    void main() {
    
    HANDLE hFile;
    PTCHAR  FileName = _T("MyFile.txt");
    PTCHAR TextString = _T("Hello, world.");
    DWORD iWrite, StringLength = lstrlen(TextString);
    
    _tprintf(_T("There are %ld symbols in text string  %s\n"),  StringLength, TextString);
    
    
    hFile = CreateFile(FileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | 0, NULL); 
    
    iWrite = StringLength;
    #ifdef UNICODE
     iWrite = 2*StringLength;
    #endif
    
    WriteFile(hFile, TextString, iWrite, iWrite, NULL);
    printf("%d bytes are written to file\n", iWrite);
    CloseHandle(hFile); 
    }

    Рекомендуется оба варианта получившегося файла просмотреть с помощью блокнота Nоtepad.

    Обработка ошибок

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

    Вызываемая Win32-функция может возвратить значение, свидетельствующее об ошибке (например, NULL для функций типа HANDLE или ноль для функций типа BOOL). В таких случаях можно попытаться выявить тип ошибки при помощи функции GetLastError - она возвращает код последней ошибки, который хранится в локальной памяти потока, вызвавшего ошибку. Коды ошибок (а их более 10 тысяч), представляющие собой 32-битные числа, находятся в заголовочном файле WinError.h.

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

    Для преобразования кода ошибки в ее содержательное описание предназначена Win32-функция FormatMessage. Получить описание ошибки по ее коду можно также с помощью утилиты errlook.exe, поставляемой в составе Visual Studio. Аналогичная информация содержится в справочной системе MSDN.

    В тех случаях, когда об ошибке необходимо оповестить пользователя, можно использовать звуковой сигнал (функция , ).

    Прогон программы, синтезирующей информацию об ошибке, которая имитирует отсутствие нужного файла

    #include <windows.h>
    #include <stdio.h>
    
    void GetError() { 
     DWORD dw = GetLastError(); 
     printf("GetLastError returned %u\n", dw); 
    } 
    void SetError() {
     DWORD dw = ERROR_FILE_NOT_FOUND;
     SetLastError (dw);
    }
         
    void main() {
     SetError();
     GetError();
    }

    Рекомендуется реализовать данную программу и сверить номер выдаваемой ошибки с соответствующим перечнем в MSDN или файле заголовка WinError.h.

    Инструментальные средства изучения системы

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

    Штатные и встроенные средства

    Большое количество полезных инструментов поставляется вместе с системой. Это, во-первых, штатные утилиты, такие, как диспетчер задач, редактор реестра, разнообразные средства настройки и администрирования, информативные панели. Очень много полезной информации можно получить путем интерпретации показаний многочисленных счетчиков производительности, предназначенных для мониторинга системы. Счетчики производительности, а их более сотни для различных объектов, доступны через оснастку "Производительность" административной панели управления, а также через API системы.

    Большое количество полезных утилит входит в состав Windows Support Tools, для их установки надо запустить Setup из папки \Support \ Tools в дистрибутиве системы.

    Утилиты и программные средства, входящие в состав Platform SDK

    В состав Microsoft Platform SDK входит более 100 полезных утилит, находящихся после установки пакета в каталоге Program Files\Microsoft SDK\Bin. Их использование регламентируется встроенными подсказками, а также прилагаемой к Platform SDK гипертекстовой системой контекстной помощи. Кроме того, в состав пакета входит большое количество библиотек, заголовочных файлов, примеров программного кода и полезной документации.

    Утилиты, поставляемые в составе Resourse Kit (ресурсы Windows)

    В комплект входит большое число утилит. Их состав частично пересекается с утилитами, входящими в комплект Microsoft Platform SDK.

    Утилиты с сайта sysinternals.com

    На данном сайте имеется много полезных свободно распространяемых утилит, большинство из которых написано М.Руссиновичем.

    Помимо перечисленных разработчиками активно используются утилиты, входящие в состав пакетов Visual Studio, DDK (Device Driver Kit), и разнообразные средства отладки. Вместе с тем, обилие инструментальных возможностей никоим образом не исключает необходимости разработки программ для всестороннего изучения ОС. Практическое применение API системы позволяет лучше изучить ее особенности, а также дает возможность создавать гибкие приложения, которые соответствуют сложным сценариям и требованиям, предъявляемым к современному программному обеспечению.

    Заключение

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

    Страницы:

    Win32 API

    Уже отмечалось, что в ОС Windows между приложением и совокупностью системных вызовов (системных сервисов в терминологии Microsoft) расположен дополнительный абстрактный слой - программный интерфейс Win32 API. За счет этого Win32-приложение может работать практически во всех версиях Windows (см. рис 1.5), несмотря на то, что сами системные вызовы в различных версиях системы различны и не документированы.

    Исчерпывающая информация по программному интерфейсу Win32 API содержится в справочной документации на Win32 API. Эту документацию можно просмотреть на сайте http://msdn.microsoft.com или на компакт-дисках MSDN (Microsoft Developer Network Library). MSDN является программой технической поддержки разработчиков.

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

    Если заглянуть в раздел MSDN \Platform SDK\ Win32\ Overview of the Win32 API, то можно увидеть, что Win32 API подразделяются на следующие группы.

  • Base Services - базовые сервисы отвечают за обеспечение доступа к ресурсам компьютера и интерфейс для работы с памятью, файлами, устройствами, процессами и потоками.
  • Common Control Library - библиотека общих элементов управления для разработки оконных интерфейсов.
  • Graphics Device Interface - вывод графики на дисплей и другие устройства.
  • Network Services - сетевые сервисы.
  • User Interface - интерфейс пользователя.
  • Windows Shell - функции для работы с оболочкой.
  • Windows System Information - информация о конфигурации системы Windows.
  • В рамках данного курса нам потребуются главным образом функции, относящиеся к первому пункту списка и описанные в MSDN разделе \Platform SDK\Base Services, а также функции, описанные в разделе \Platform SDK\ Security.

    Компилятор Visual C++ и среда программирования для Windows

    Предполагается, что читатель знаком с типичными приложениями Windows, такими, как Проводник (Windows Explorer), ориентируется в файловой системе компьютера и в состоянии найти любой файл, записанный на жестком диске.

    Компилятор Windows Visual C++ удобно объединять со справочной системой MSDN Library, которая при этом вызывается через пункт меню "Справка" ("Help") в интегрированной среде Microsoft Visual C++, а также может использоваться автономно. Запуск установленной графической оболочки Microsoft Visual C++ осуществляется стандартными средствами системы.

    Чтобы из текста программы на языке высокого уровня (файл с расширением "c" или "cpp") получить исполняемую программу в машинных кодах (файл с расширением "exe"), необходимо в графической оболочке Microsoft Visual Studio C++ создать рабочий проект, который представляет собой совокупность служебных файлов, необходимых для дальнейшей работы.

    Программные примеры, иллюстрирующие данный курс, представляют собой Windows-приложения с текстовым интерфейсом (консольные). Разработка приложений с дружественным графическим интерфейсом сама по себе достаточно сложна и должна изучаться в рамках специальных учебных курсов. Поэтому, формируя проект, далее в графической оболочке Visual Studio в диалоговом окне "New" нужно выбрать Win32 Console Application в качестве типа приложения, а также дать проекту имя, указать каталог расположения файлов проекта и нажать кнопку "OK".

    Затем при помощи пунктов меню и всплывающих окон графической оболочки нужно включить в проект файлы, содержащие программу, или ввести программу с клавиатуры с последующим ее сохранением в одном из файлов проекта. Через пункт меню "Build" можно выполнить компиляцию программы, создать исполняемый модуль, запустить программу на счет и, при необходимости, выполнить ее отладку. Существует большое количество разнообразных руководств по использованию Microsoft Visual Studio C++.

    Прогон программы "Hello, world"

    В качестве самостоятельного упражнения рекомендуется реализовать простейшую программу в интегрированной среде компилятора Visual C++, например, хрестоматийную программу "Hello, world", и ознакомиться со средствами разработки, отладки и контекстной помощи.

    Типы данных, используемые в Win32-приложениях

    Мобильность программ и их независимость от конкретной платформы во многом обеспечивается введением новых стандартных типов данных - определенных на основе простых типов языка программирования Си. Имена стандартных типов данных состоят из символов верхнего регистра, для них не применяется оператор "*".

    Полный перечень используемых данных можно увидеть в разделе \Plarform SDK \Win32 API\ Reference \ Data Types. Ниже приведен список наиболее распространенных типов: симовольных, целых, булевских, указателей и описателей (handles). Символьные, целые и булевские типы соответствуют аналогичным типам большинства диалектов языка Си. Имена типов-указателей содержат префикс "P" или "LP". Описатели имеют отношение к ресурсам, загруженным в память.

    Наиболее часто используются следующие типы данных:

  • BOOL - булевская переменная ( TRUE или FALSE );
  • CHAR - 8- разрядный символ;
  • DWORD - 32-разрядное беззнаковое целое;
  • HANDLE - описатель объекта;
  • INT - 32-разрядное целое;
  • LPSTR - указатель на строку 8-разрядных символов, заканчивающуюся нулем;
  • LPTSTR - LPWSTR в случае Unicode или LPSTR в случае ANSI;
  • LPVOID - указатель на любой тип;
  • LPWSTR - указатель на строку 16-разрядных (Unicode) символов, заканчивающуюся нулем;
  • TCHAR - WCHAR, в случае Unicode или CHAR в случае ANSI;
  • WCHAR - 16-разрядный Unicode символ;
  • WORD - 16-разрядное беззнаковое целое.
  • Остальные типы данных будут изучаться по мере необходимости. Некоторые Win32 приложения могут быть выполнены в среде более ранних версий ОС Windows, в том числе и 16-разрядных. Вследствие этого имена некоторых типов отражают систему адресации ОС MS-DOS, например, LP (long pointer) означает "длинный" указатель, а на самом деле - это обычный указатель.

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

    Unicode

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

    Стандарт Unicode поддерживается консорциумом, в который входят такие компании, как Apple, Compaq, Hewlett-Packard, IBM, Microsoft и многие другие; подробная информация об этом имеется на сайте http://www.unicode.org. В справочнике MSDN соответствующие сведения хранятся в разделе \Visual Studio documentation\ Visual C++ Programmer's Guide \ Adding Program Functionality \ Overviews \ Unicode Programming.

    Для совместимости со стандартами языков программирования и предыдущими версиями Windows в системе наряду с 16-битными (двухбайтовыми) символами активно используются и 8-битные (однобайтовые) ANSI символы. Так, многие Win32-функции , принимающие строковые параметры, существуют в двух версиях: для Unicode и для ANSI. Обычно при вызове ANSI-версии Win32-функции входные строковые параметры перед обработкой системой преобразуются в Unicode. В связи с этим перед разработчиками стоит задача написания приложений, способных работать с обеими кодировками.

    Разработка приложений с использованием Unicode

    Чтобы снизить зависимость приложения от используемой кодировки, целесообразно в программе определить два макроса - UNICODE и _UNICODE. Также рекомендуется использовать новый набор данных и функций, обрабатывающих строки и описанных в стандартных заголовочных файлах.

    Обычно, имена Unicode данных и функций содержат префикс "wc" (от wide character), "w". Например, WCHAR - Unicode символ, wcscmp - функция сравнения Unicode строк. Можно также поставить префикс "L" перед текстовой строкой, например, L"Текстовая строка" - строка в формате Unicode.

    Чтобы реализовать возможности компиляции двойного назначения, нужно включить в состав программы заголовочный файл tchar.h. Он состоит из макросов, которые ссылаются на Unicode данные и функции, если в программе определен макрос .

    Прогон программы вывода строки в формате Unicode

    В качестве упражнения рекомендуется реализовать программу вывода строки "Hello, world".

    #define UNICODE
    #ifdef UNICODE
    #define _UNICODE
    #endif
    #include <windows.h>
    #include <tchar.h>
    #include <stdio.h>
    
    void main() {
    PTCHAR TextString = _T("Hello, world");
    _tprintf(_T("String -  %s\n"), TextString);
    }

    Необходимо убедиться, что программа одинаково работает в случае применения и отключения Unicode.

    Прогон программы записи в файл в Unicode и обычном формате

    Приведенная программа может вывести строку "Hello, world" в файл MyFile.txt в обычном формате и в формате Unicode.

    #define UNICODE
    #ifdef UNICODE
    #define _UNICODE
    #endif
    #include <windows.h>
    #include <tchar.h>
    #include <stdio.h>
    
    void main() {
    
    HANDLE hFile;
    PTCHAR  FileName = _T("MyFile.txt");
    PTCHAR TextString = _T("Hello, world.");
    DWORD iWrite, StringLength = lstrlen(TextString);
    
    _tprintf(_T("There are %ld symbols in text string  %s\n"),  StringLength, TextString);
    
    
    hFile = CreateFile(FileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | 0, NULL); 
    
    iWrite = StringLength;
    #ifdef UNICODE
     iWrite = 2*StringLength;
    #endif
    
    WriteFile(hFile, TextString, iWrite, iWrite, NULL);
    printf("%d bytes are written to file\n", iWrite);
    CloseHandle(hFile); 
    }

    Рекомендуется оба варианта получившегося файла просмотреть с помощью блокнота Nоtepad.

    Обработка ошибок

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

    Вызываемая Win32-функция может возвратить значение, свидетельствующее об ошибке (например, NULL для функций типа HANDLE или ноль для функций типа BOOL). В таких случаях можно попытаться выявить тип ошибки при помощи функции GetLastError - она возвращает код последней ошибки, который хранится в локальной памяти потока, вызвавшего ошибку. Коды ошибок (а их более 10 тысяч), представляющие собой 32-битные числа, находятся в заголовочном файле WinError.h.

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

    Для преобразования кода ошибки в ее содержательное описание предназначена Win32-функция FormatMessage. Получить описание ошибки по ее коду можно также с помощью утилиты errlook.exe, поставляемой в составе Visual Studio. Аналогичная информация содержится в справочной системе MSDN.

    В тех случаях, когда об ошибке необходимо оповестить пользователя, можно использовать звуковой сигнал (функция , ).

    Прогон программы, синтезирующей информацию об ошибке, которая имитирует отсутствие нужного файла

    #include <windows.h>
    #include <stdio.h>
    
    void GetError() { 
     DWORD dw = GetLastError(); 
     printf("GetLastError returned %u\n", dw); 
    } 
    void SetError() {
     DWORD dw = ERROR_FILE_NOT_FOUND;
     SetLastError (dw);
    }
         
    void main() {
     SetError();
     GetError();
    }

    Рекомендуется реализовать данную программу и сверить номер выдаваемой ошибки с соответствующим перечнем в MSDN или файле заголовка WinError.h.

    Инструментальные средства изучения системы

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

    Штатные и встроенные средства

    Большое количество полезных инструментов поставляется вместе с системой. Это, во-первых, штатные утилиты, такие, как диспетчер задач, редактор реестра, разнообразные средства настройки и администрирования, информативные панели. Очень много полезной информации можно получить путем интерпретации показаний многочисленных счетчиков производительности, предназначенных для мониторинга системы. Счетчики производительности, а их более сотни для различных объектов, доступны через оснастку "Производительность" административной панели управления, а также через API системы.

    Большое количество полезных утилит входит в состав Windows Support Tools, для их установки надо запустить Setup из папки \Support \ Tools в дистрибутиве системы.

    Утилиты и программные средства, входящие в состав Platform SDK

    В состав Microsoft Platform SDK входит более 100 полезных утилит, находящихся после установки пакета в каталоге Program Files\Microsoft SDK\Bin. Их использование регламентируется встроенными подсказками, а также прилагаемой к Platform SDK гипертекстовой системой контекстной помощи. Кроме того, в состав пакета входит большое количество библиотек, заголовочных файлов, примеров программного кода и полезной документации.

    Утилиты, поставляемые в составе Resourse Kit (ресурсы Windows)

    В комплект входит большое число утилит. Их состав частично пересекается с утилитами, входящими в комплект Microsoft Platform SDK.

    Утилиты с сайта sysinternals.com

    На данном сайте имеется много полезных свободно распространяемых утилит, большинство из которых написано М.Руссиновичем.

    Помимо перечисленных разработчиками активно используются утилиты, входящие в состав пакетов Visual Studio, DDK (Device Driver Kit), и разнообразные средства отладки. Вместе с тем, обилие инструментальных возможностей никоим образом не исключает необходимости разработки программ для всестороннего изучения ОС. Практическое применение API системы позволяет лучше изучить ее особенности, а также дает возможность создавать гибкие приложения, которые соответствуют сложным сценариям и требованиям, предъявляемым к современному программному обеспечению.

    Заключение

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

    Вернуться к учебному плану