Функции получения системной информации
Цель работы: получение практических навыков по программированию в Win32 API
С использованием аппаратных и системных функций.
Интерфейс прикладного программирования (Application Programming Interface Win32 - Win32 API) - это программный интерфейс, который используется для управления 32-разрядными операционными системами Windows 9x и Windows NT. Более точно, Win32 API состоит из набора функций и подпрограмм, предоставляющих программный доступ к возможностям операционной системы. Win32 API содержит более 3000 функции для реализации всех видов сервисов операционной системы.
API-функции Windows входят в состав динамически подключаемых библиотек.
Динамически подключаемая библиотека (DLL) является исполняемым файлом, который содержит несколько экспортируемых функций, то есть функций, к которым могут обращаться другие исполняемые приложения (ЕХЕ или DLL). Файлы DLL намного проще файлов ЕХЕ, например, в них нет кода, который управлял бы графическим интерфейсом или обрабатывал сообщения Windows.
Для размещения API-функций Windows использует несколько DLL. В действительности большая часть функций Win32 API содержится в трех DLL:
KERNEL32.DLL - содержит около 700 функций, которые предназначены для управления памятью, процессами и потоками;
USER32.DLL - предоставляет порядка 600 функций для управления пользовательским интерфейсом, например, созданием окон и передачей сообщений;
GDI.DLL - экспортирует около 400 функций для рисования графических образов, отображения текста и работы со шрифтами.
Кроме этих библиотек Windows также содержит несколько других DLL более узкой специализации. Например,
COMDLG32.DLL - открывает доступ почти к 20 функциям управления стандартными диалоговыми окнами Windows;
|
LZ32.DLL - хранит примерно 12 функций архивирования и разархивирования файлов;
ADVAPI32.DLL - экспортирует около 400 функций, связанных с защитой объектов и работой с реестром;
WINMM.DLL - содержит около 200 функций, относящихся к мультимедиа.
Основные Win32 API-функции получения системной информации перечислены ниже:
GetComputerName GetSystemMetrics GetWindowsDirectoty
GetKeyboardTyре GetTempPath SetСоmрuterName
GetSysColor GetUserName SetSysColors
CecSystemDirectory GetVersion SystemParametersInfo
GetSystemlnfo GetVersioriEx GetUserName
Имя компьютера
Функция GetComputerName используется для получения текущего имени компьютера. Связанная с ней SetСomputerName используется для присвоения имени компьютеру.
BOOL GetComputerName(
LPTSTR IpBuffer, // Адрес буфера имени.
LPDWORD nSize // Размер буфера имени.
);
В соответствии с документацией, выполнение функции GetComputerName в Windows 9х завершится неудачей, если размер буфера входных данных меньше, чем величина константы MAX_COMPUTERNAME_LENGTH + 1.
Пути к системным каталогам Windows
Функции GetWindowsDirectory, GetSystemDirectory и GetTempPath находят путь к каталогу, к системному каталогу и к каталогу временных файлов Windows. Например, функция GetSystemDirectory определена как:
U1NT GetSystemDirectory (
LPTSTR IpBuffer, // Адрес буфера системного каталога.
UINT nSize
); // Размер буфера каталога.
UINT GetWindowsDirectory(
LPTSTR IpBuffer, // Адрес буфера каталога Windows .
UINT nSize // Размер буфера каталога.
);
DWORD GetTempPath(
DWORD nBufferLength, // Размер буфера в символах.
LPTSTR IpBuffer // Указатель на буфер пути к каталогу
// временных файлов.
);
Версия операционной системы
Функция GetVersionEx возвращает информацию о версии операционной системы Windows и может использоваться для определения рабочей системы -Windows 95, Windows 98 или Windows NT. Она объявляется как
|
BOOL GetVersionEx(
LPOSVERSIONINFO IpVersionlnformation. // Указатель на структуру
//с информацией о версии.
);
где IpVersionlnformation - указатель на структуру OSVERSIONINFO, которая определена следующим образом:
typedef struct _OSVERSIONINFO (
DWORD dwOSVersionlnfoSise;
DWORD dwMajorVersion;
DWORD dwMinorVersion;
DWORD dwBuildNumber;
DWORD dwPlatformId;
TCHAR szCSDVersion[ 128 ];
) OSVERSIONINFO;
В документации об этой структуре говорится следующее:
DwOSVersionlnfoSize
Задает размер структуры OSVERSIONINFO в байтах. Для структур это является общим требованием. Так как DWORD - четырехбайтовое беззнаковое типа long и поскольку Delphi и VB преобразуют строку из 128 символов в массив символов ANSI из 128 байт, общий размер структуры составляет. 4x5+ 128 = 148 байт. Это значение возвращает функция Len для VB и SizeOf для Delphi.
DwMajorVersion
Указывает номер основной версии операционной системы. Например, для Windows NT версии 3.51 номер основной версии - 3. Для Windows NT 4.0 и Windows 9х номер основной версии - 4.
DwMinorVersion
Указывает дополнительный номер версии операционной системы. Например, для Windows NT версии 3.51 дополнительный номер версии - 51. Для Windows NT 4.0 и Windows 95 дополнительный номер версии - 0. Для Windows 98 дополнительный номер версии - 10.
DwBuildNumber
Указывает номер сборки операционной системы для Windows NT. Для Windows 9х два младших байта содержат номер сборки операционной системы, а два старших байта - номер основной версии и дополнительный номер версии.
DwPiatformId
Идентифицирует платформу операционной системы, может иметь одно из следующих значений:
VER_PLATFORM_WIN32s (= 0). Win32s, работающая на Windows
VER_PLATFORM_WIN32_WINDOWS (= 1). Win32, работающая на Windows 95 или
|
Windows 98.
VER_PLATFORM_WIN32_NT (= 2). Win32, работающая на Windows NT
SzCSDVersion
В Windows NT содержит строку завершающеюся нулевым символом, например «Service Pack3», которая указывает самую последнюю версию установленного в системе служебного пакета программ (service pack). Строка будет пустой, если служебный пакет не установлен. В Windows 95 включает строку с завершающим нулевым символом, в которой может быть произвольная дополнительная информация об операционной системе.
Системные метрики
Функция GetSystemMetrics получает информацию о метриках (системе единиц измерения) объектов операционной системы.
Int GetSystemMetrics(
int nlndex // Системная метрика или установки конфигурации.
);
Параметр nIndex принимает значение одной из 84 возможных констант. Функция возвращает запрошенные единицы измерения (в общем случае в пикселях или в безразмерных единицах).
Чтобы дать общее представление о типе возвращаемой информации, здесь приведены образцы некоторых констант для этой функции. Единицы измерения высоты и ширины приведены в пикселях:
SM_CMOUSEBUTTOMS = 43 // Delphi ' Количество клавиш мыши.
Const SM_CMOUSEBUTTOMS = 43 // VB
SM_MOUSEWHEELPRESENT = 75 ' Истина (True), если мышь имеет
' колесо прокрутки.
' (Только Win NT 4 или Win 98.)
SM_SWAPBUTTON = 23 ' Истина (True), если клавиши мыши
' можно поменять местами (мышь ' для левши).
SM_CXBORDER = 5 ' Ширина и высота рамки окна.
SM_CYBORDER = 6
SM_CXSCREEN = 0 ' Ширина и высота экрана.
SM_CYSCREEN = 1
SM_CXFULLSCREEN = 16 ' Ширина и высота области
' приложения в полноэкранном
SM_CYFULLSCREEN = 17 'режиме.
SM_CXHTHUMB = 10 'Ширина прямоугольного курсора
'в горизонтальной полосе 'прокрутки.
SM_CXICONS PACING = 38 'Размеры ячейки сетки для
SM_CYICONSРАСING = З9 'значка в режиме просмотра с 'крупными значками.
SM_CYCAPTION = 4 ' Высота стандартной области 'заголовка.
Системные параметры
Функция SystemParamterslnfo - это мощная функция, предназначенная для получения или установки всех системных параметров. Также она может в процессе установки параметра обновлять пользовательские профили. Ниже приведена ее декларация:
BOOL SystemParametersInfo (
UINT uiAction, // Запрашиваемый или устанавливаемый
// системный параметр.
UINТ uiParam, // Зависит от принятого системного
// параметра.
PVOID pvParam, // Зависит от принятого системного параметра.
UINT fWinIni // Флаг обновления пользовательского профиля.
};
Эта функция может принимать, по меньшей мере, 90 различных значений uiAction. Ниже приведены некоторые константы uiAction:
SPI_GETACCESSTIMEOUT - используется для определения данных о временных интервалах, относящихся к специальным возможностям Windows;
SPI_GETANIMATION – используется для определения данных об анимации, используемой при сворачивании и восстановлении окон;
SPI_GETBEEP - признак разрешения звуковых сигналов;
SPI_GETBORDER – параметру присваивается коэффициент, управляющий толщиной рамки для изменения размеров окна;
SPI_GETDEFAULTINPUTLANG – параметру присваивается 32-х разрядный дескриптор раскладки клавиатуры по умолчанию;
SPI_GETDRAGFULLWINDOWS – характеристики перемещения окна мышью;
SPI_GETFASTTASKSWITCH – признак, определяющий быстрое переключение задач;
SPI_GETFILTERKEYS - используется для определения данных о специальных возможностях, относящихся к работе с клавиатурой;
SPI_GETFONTSMOOTHING - режимы сглаживания шрифтов;
SPI_GETGRIDGRANULARITY – гранулярность сетки рабочего стола;
SPI_GETICONMETRICS - используется для определения информации о характеристиках иконок.
Системные цвета
Функции GetSysColor и SetSysColors используются для получения и установки цветов различных элементов системы, таких как кнопки, строки заголовков и т.д. Цветовой палитрой также может управлять пользователь с помощью апплета Display (Экран) на панели Control Panel (Панель управления).
Декларация GetSysColor:
DWORD GetSysColor (
int nIndex // Элемент экрана.
);
nIndex может принимать значение одной из множества символьных констант, например
#define COLOR_ACTIVECAPTION 3
Возвращаемое значение - это цвет в формате RGB. В частности, каждый цвет занимает один байт в возвращаемом значении типа unsigned long: красный цвет - младший байт, зеленый - следующий байт, далее - синий цвет. Самый старший байт равен нулю. Байты цветов представлены в переменной типа long в обратном порядке, поскольку при записи переменной в память байты располагаются от младших к старшим.
Объявление функции SetsysColors:
BOOL WINAPI SetSysColors (
int cElements, // Количество изменяемых
// элементов.
CONST INT *lpaElements, // Адрес массива элементов.
CONST COLORREF *lpaRgbValues // Адрес массива значений RGB.
Здесь cElements определяет количество системных элементов, цвет которых требуется изменить; IpaElements - указатель на целочисленный массив VC++, который содержит индексы изменяемых элементов; IpaRgbvalues ссылается на целочисленный массив VC++ новых значений цвета в формате RGB.
Функции для работы со временем
Во внутренней работе Windows используется универсальное координированное время UTC (Universal Coordinated Time); также встречается термин GMT, то есть «среднее время по Гринвичу» (Greenwich Mean Time), поскольку за точку отсчета принят Гринвич, Англия. Преобразования между системным и местным временем в Windows осуществляются при помощи поправок для местного часового пояса, заданного в системе. Функции Win32 позволяют работать как в местном, так и в системном времени и преобразовывать их по мере необходимости. Win32 также включает ряд функций для работы с файловым временем и датой, то есть временем и датой файлов, хранящихся в файловой системе
Функции Windows, предназначенные для получения информации о времени, перечислены ниже. Следует учитывать, что во внутреннем представлении системы время изменяется в тактах таймера, продолжительность которых может изменяться в зависимости от используемого процессора и операционной системы. Интервал измерения времени в Win32 обычно занимает от 10 до 15 миллисекунд. Длительность такта определяет точность результатов, возвращаемых этими функциями.
Основные функции Windows для работы со временем
Функция | Описание |
EnumCalendarlnfo | Перечисляет календарную информацию, зависящую от локального контекста |
EnuinDate Formats | Перечисляет форматы даты, доступные в заданном локальном контексте |
EnumTimeFormats | Перечисляет форматы времени, доступные в заданном локальном контексте |
GetLocalTime | Получает текущее местное время |
GetMessageTime | Возвращает время (в миллисекундах) поступления последнего сообщения s очередь приложения. Время отсчитывается от начала текущего сеанса работы в Windows |
GetSystemTime | Получает текущее системное время |
GetSystemTimeAdjustment | Определяет, применяется ли в системе периодическая поправка, повышающая точность отсчета системного времени |
GetTickCount | Получает продолжительность работы текущего сеанса работы в Windows в миллисекундах |
GetTimeFormat | Форматирует время в заданном локальном контексте |
GetTimeZonelnformation | Получает информацию о текущем часовом поясе |
SetLocalTime | Задает местное время |
SetSystemTime | Задает системное время |
SetSystemTimeAdjustment | Задает периодическую поправку, применяемую системой для повышения точности отсчета времени |
SetTimeZonelnformation | Задает часовой пояс |
SystemTimeToTzSpecificLocalTime | Преобразует системное время в местное |
СОДЕРЖАНИЕ ОТЧЕТА
1. Наименование лабораторной работы, ее цель.
2. Разработанное программное обеспечение приложения, обеспечивающего получение следующей системной информации:
§ Имя компьютера, имя пользователя;
§ Пути к системным каталогам Windows;
§ Версия операционной системы;
§ Системные метрики (не менее 2 метрик);
§ Системные параметры (не менее 2 параметров);
§ Системные цвета (определить цвет для некоторых символьных констант и изменить его на любой другой);
§ Функции для работы со временем;
§ Дополнительные API-функции:
Вариант | Название API-функции |
ActivateKeyboardLayout, GetCurrencyFormat, GetLastError, OemToChar | |
CharToOem, GetCursor, GetLocaleInfo, OemToCharBuff, | |
AnsiToOemBuff, GetCursorPos, GetNumberFormat, SetCaretPos, | |
ClipCursor, GetDoubleClickTime, GetOEMCP, SetCursor | |
CreateCaret, GetEnvironmentStrings, GetQueueStatus, SetCursorPos | |
DestroyCaret, GetEnvironmentVariable, GetSystemDefaultLangID, SetDoubleClickTime | |
EnumSystemCodePages, GetInputState, GetLastError, SetKeyboardState | |
ExitWindowsEx, GetKBCodePage, GetSystemDefaultLCID, SetCaretBlinkTime | |
GetACP, GetKeyboardLayout, GetSystemPowerStatus, SetComputerName | |
GetAsyncKeyState, GetKeyboardLayoutList, GetTickCount, SetLocaleInfo | |
GetCaretBlinkTime, GetKeyboardLayoutName, GetLastError, SetSystemCursor | |
GetCaretPos, GetKeyboardState, GetUserDefaultLangID, SetSystemPowerState | |
GetClipCursor, GetKeyboardType, GetUserDefaultLCID, ShowCursor | |
GetCommandLine, GetKeyNameText, MessageBeep, SwapMouseButton | |
GetCPInfo, GetKeyState, GetLastError, UnloadKeyboardLayout |
3. Примеры разработанных приложений (результаты и тексты программ).