Лаб_раб_Функции WIN API получения системной информации. Функции получения системной информации
Скачать 49.92 Kb.
|
Лабораторная работа Тема «Функции получения системной информации» Цель работы: Получение практических навыков по программированию в Win32 API с использованием аппаратных и системных функций. В настоящее время Microsoft предлагает две 32-разрядные операционные системы – Windows 9x (Windows 95, 98, ME) и Windows NT (Windows NT, 2000, XP). Интерфейс прикладного программирования (Application Programming Interface Win32 - Win32 API) - это программный интерфейс, который используется для управления этими операционными системами. Или, более конкретно, Win32 API состоит из набора функций и подпрограмм, предоставляющих программный доступ к возможностям операционной системы. Иначе говоря, программные интерфейсы приложений представляют собой наборы функций (в этот обобщенный термин мы включаем и подпрограммы), которые обеспечивают сервисы данного приложения. Win32 API содержит более 3000 функции для реализации всех видов сервисов операционной системы. API-функции Windows входят в состав динамически подключаемых библиотек, поэтому необходимо дать четкое определение DLL и кратко изложить основные принципы их работы. Динамически подключаемая библиотека (Dynamic Link Library - DLL) является исполняемым файлом, который содержит несколько экспортируемых функции (exportable functions), то есть функций, к которым могут обращаться другие исполняемые приложения (ЕХЕ или 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 GetSystemDirectory GetVersion SystemParametersInfo GetSystemInfo GetVersioriEx GetUserName Имя компьютера Функция GetComputerName используется для получения текущего имени компьютера. Связанная с ней SetСomputerName используется для присвоения имени компьютеру. Объявление в Delphiзаписывается таким образом: MAX_COMPUTERNAME_LENGTH = 15; Пример небольшой функции, возвращающей имя компьютера: var Bufer : array [0..MAX_COMPUTERNAME_LENGTH+1] of char; size : cardinal; . . . . . . size := SizeOf(Bufer); GetComputerName(@Bufer,Size); edit1.text:=bufer; Пути к системным каталогам Windows Функции GetWindowsDirectory, GetSystemDirectory и GetTempPath находят путь к каталогу, к системному каталогу и к каталогу временных файлов Windows. Например, функция GetSystemDirectory определена как: U1NTGetSystemDirectory( LPTSTRIpBuffer, // Адрес буфера системного каталога. UINTnSize ); // Размер буфера каталога. UINTGetWindowsDirectory( LPTSTRIpBuffer, // Адрес буфера каталога Windows. UINT nSize // Размер буфера каталога. ); DWORD GetTempPath( DWORD nBufferLength, // Размер буфера в символах. LPTSTR IpBuffer // Указатель на буфер пути к каталогу // временных файлов. ); Соответствующие описание в Delphi: function GetWindowsDirectory(lpBuffer: PChar; uSize: UINT): UINT; stdcall; function GetWindowsDirectory; external kernel32 name 'GetWindowsDirectoryA'; function GetTempPath(nBufferLength: DWORD; lpBuffer: PChar): DWORD; stdcall; function GetTempPath; external kernel32 name 'GetTempPathA'; function GetSystemDirectory(lpBuffer: PChar; uSize: UINT): UINT; stdcall; function GetSystemDirectory; external kernel32 name 'GetSystemDirectoryA'; Каждая из этих функций возвращает количество символов, помещенных в буфер строки. Размер буферов должен быть на единицу больше длины соответствующей символьной константы: MAX_PATH = 260; На компьютере возможен такой вывод: С:\WINNT C:\WINNT\System32 С:\TEMP\ Версия операционной системы Функция GetVersionEx возвращает информацию о версии операционной системы Windows и может использоваться для определения рабочей системы -Windows 95, Windows 98 или Windows NT. Она объявляется как BOOLGetVersionEx( LPOSVERSIONINFOIpVersionlnformation. // Указатель на структуру //с информацией о версии. ); где 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 включает строку с завершающим нулевым символом, в которой может быть произвольная дополнительная информация об операционной системе. Соответствующие описание в Delphi: function GetVersionEx(var lpVersionInformation: TOSVersionInfo): BOOL; stdcall; function GetVersionEx; external kernel32 name 'GetVersionExA'; _OSVERSIONINFOA = record dwOSVersionInfoSize: DWORD; dwMajorVersion: DWORD; dwMinorVersion: DWORD; dwBuildNumber: DWORD; dwPlatformId: DWORD; szCSDVersion: array[0..127] of AnsiChar; Такой подход реализует передачу адреса структуры OSVERSIONINFO по ссылке. Type OSVERSIONINFO dwOSVersionlnfoSize As Long dwMajorVersion As Long dwMinorVersion As Long dwBuildNumber As Long dwPlatformId As Long szCSDVersion As String * 128 ' 128 символов. End Type Небольшая функция на VB возвращает наименование операционной системы: PublicFunctionGetOsVersion() AsString Dim Iret As Long Dim osverinfo As OSVERSIONINFO Osverinfo.dwOSVersionlnfoSize = Len(osverinfo) Iret = GetVersionEx(osverinfo) If Iret = 0 Then GetOSVersion = "unknown" Else Select Case osverinfo.dwPlatformId & "/" & osverinfo.dwMajorVersion _ & " "& osverinfo.dwMinorVersion Case "1/4/0" GetOSVersion = "Win95" Case "1/4/10" GetOSVersion = "Win98" Case "2/3/51 " GetOSVersion = "WinNT351" Case "2/4/0" GetOSVersion = "WinNT4 " Case "2/5/1" GetOSVersion= "WinXP " End Select End If EndFunction Системные метрики Функция GetSystemMetrics получает информацию о метриках (системе единиц измерения) объектов операционной системы.Декларация в VC++ проста: Int GetSystemMetrics( intnlndex// Системная метрика или установки конфигурации. ) ; Соответствующие описание в Delphi (unit Windows): function GetSystemMetrics(nIndex: Integer): Integer; stdcall; function GetSystemMetrics; external user32 name 'GetSystemMetrics'; Это переводится в VB так: Declare Function GetSystemMetrics Lib "user32 " ( _ ByVal nIndex As Long _ ) AsLong Параметр 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_CXICONSPACING = 38 'Размеры ячейки сетки для SM_CYICONSРАСING = З9 'значка в режиме просмотра с 'крупными значками. SM_CYCAPTION = 4 ' Высота стандартной области 'заголовка. Далее представлена примерный фрагмент программы (Delphi). Label1.Caption:= ' Ширина и высота рамки окна = '+ inttostr(GetSystemMetrics( SM_CXBORDER))+ ', '+ inttostr( GetSystemMetrics(SM_CYBORDER)); Label2.Caption:= ' Высотазаголовка = '+ inttostr( GetSystemMetrics(SM_CYCAPTION)); Label3.Caption:= ' Ширинакурсора = '+ inttostr( GetSystemMetrics(SM_CXCURSOR)); Label4.Caption:= ' Высотакурсора = '+ inttostr( GetSystemMetrics(SM_CYCURSOR)); Label5.Caption:= ' Ширинаиконки = '+ inttostr( GetSystemMetrics((SM_CXICON)); Label6.Caption:= ' Минимальнаяширинаокна = '+ inttostr(GetSystemMetrics( SM_CXMIN)); Системные параметры Функция SystemParamterslnfo - это мощная функция, предназначенная для получения или установки всех системных параметров. Она может также в процессе установки параметра обновлять пользовательские профили. Ниже приведена ее декларация: BOOLSystemParametersInfo ( UINTuiAction, // Запрашиваемый или устанавливаемый // системный параметр. UINТ uiParam, // Зависит от принятого системного // параметра. PVOIDpvParam, // Зависит от принятого системного параметра. UINTfWinIni // Флаг обновления пользовательского профиля. }; Соответствующие описание в Delphi (unit Windows): function SystemParametersInfo; external user32 name 'SystemParametersInfoA'; function SystemParametersInfo(uiAction, uiParam: UINT; pvParam: Pointer; fWinIni: UINT): BOOL; stdcall; Она может быть переведена в VB так: Declare Function SystemParametersInfo Lib "user32" _ Alias "SystemParametersInfoA" ( _ ByVal uiAction As Long, _ ByVal uiParam As Long, _ pyParam As Any, _ ByVal fWinIni As Long _ ) As Long Заметьте, что для корректного преобразования типов (type safety) можно изменять тип данных pvParam в зависимости от принятого системного параметра. Эта функция может принимать, по меньшей мере, 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 - используется для определения информации о характеристиках иконок; Но мы рассмотрим всего один из примеров для SPI_GETICONMETRICS на VB. Обратите внимание, что функция возвращает в случае успеха ненулевое значение и нуль в случае неудачи. Она устанавливает GetLastError, так что можно использовать значение VB Err.LastDLLError. Характеристики системных иконок Получать или устанавливать характеристики системных значков (icons), подобных тем, которые появляются на рабочем столе, можно с помощью констант: Public Const SPI_GETICONMETRICS = 45 Public Const SPI_SETICONMETRICS = 46 Согласно документации о SPI_GETICONMETRICS, параметр pvParam должен указывать на структуру ICONMETRICS, в которую записываются запрашиваемые сведения. В SPI_SETICONMETRICS параметр pvParam должен ссылаться на структуру ICONMETRICS, которая содержит новые параметры. В обоих случаях нужно также присвоить члену cbSize структуры ICONMETRICS и параметру uiParam в SystemParameterslnfо значение размера структуры в байтах. Объявление структуры ICONMETRICS выглядит так: typedef struct tagICONMETRICS { UINT cbSize; int iHorzSpacmg; int iVertSpacing; int iTitleWrap; LOGFONT IfFont; { ICONMETRICS, FAR *LPICONMETRICS; А структура LOGFONT объявляется следующим образом: typedef struct tagLOGFONT { // If. LONG If Height; LONG IfWidth; LONG IfEscapement; LONG IfOrientation; LONG IfWeight; BYTE IfItalic; BYTE IfUnderline; BYTE IfStrikeout; BYTE IfCharSet; BYTE IfOutPrecision; BYTE IfClipPrecision, BYTE IfQuality; BYTE IfPitchAndFamily; TCHAR lfFaceName[LF_FACESIZE]; } LOGFONT; где Public Const LF_FACESIZE = 32 Здесь есть важный момент, который следует отметить. Очень часто одна структура содержит указатели на другие структуры. Однако в данном случае переменная IfFont является на самом деле структурой, а не указателем на нее. Следовательно, необходимо объединить обе структуры при создании версии VB: PublicTypeICONMETRICS cbsize As Long iHorzSpacing As Long iVertSpacing As Long iTitleWrap As Long IfHeight As Long IfWidth As Long IfEscapement As Long lEOrientation As Long IfWeight As Long Ifltalic As Byte IfUnderline As Byte IfStrikeout As Byte IfCharset As Byte IfOutPrecision As Byte IfClipPrecision As Byte IfQuality As Byte IfPitchAndFamily As Byte IfFaceName As String * LF_FACESIZE End Type Заметьте, что эта структура построена грамотно с точки зрения выравнивания членов. Под IfFaceName можно было бы использовать и массив байтов, и строку фиксированной длины. Но при выводе возвращаемого значения проще использовать строку фиксированной длины. Далее приведена программа, которая использует эту функцию: Public Sub PrintlconMetrics Dim im As ICONMETRICS im.cbSize*= Len(im) Iret = SystemParametersInfo(SPI_GETICOMMETRICS, Len(im), im, 0&) If Iret = 0 Then RaiseApiError Err.LastDllError Else Debug.Print "Hor Spacing:" & im.iHorzSpacing Debug.Print "Vert Spacing:" & im.iVertSpacing Debug.Print im.IfFaceName & "/" EndIf EndSub Вывод на компьютере может быть таким: Hor Spacing:101 Vert Spacing:109 MS Sans Serif Системные цвета Функции GetSysColor и SetSysColors используются для получения и установки цветов различных элементов системы, таких как кнопки, строки заголовков и т.д. Цветовой палитрой может также управлять пользователь с помощью апплета Display (Экран) на панели Control Panel (Панель управления). Декларация GetSysColor проста: DWORDGetSysColor ( int nIndex // Элемент экрана. ); где nIndex может принимать значение одной из множества символьных констант, например #define COLOR_ACTIVECAPTION 3 Соответствующие описание в Delphi (unit Windows): function GetSysColor; external user32 name 'GetSysColor'; function GetSysColor(nIndex: Integer): DWORD; stdcall; В VB это выглядит так: Declare Function GetSysColor Lib "user32" (ByVal nIndex As Long) As Long PublicConstCOLOR_ACTIVECAPTION = 3 Возвращаемое значение - это цвет в формате RGB. В частности, каждый цвет занимает один байт в возвращаемом значении типа unsigned long: красный. Цвет - младший байт, зеленый - следующий байт, далее - синий цвет. Самый старший байт равен нулю. Байты цветов представлены в переменной тина long в обратном порядке, поскольку при записи переменной в память байты располагаются от младших к старшим. Объявление функции SetsysColors: BOOL WINAPI SetSysColors ( int cElements, // Количество изменяемых // элементов. CONST INT *lpaElements, // Адрес массива элементов. CONST COLORREF *lpaRgbValues // Адрес массива значений RGB. Соответствующие описание в Delphi (unit Windows): function SetSysColors(cElements: Integer; const lpaElements; const lpaRgbValues): BOOL; stdcall; function SetSysColors; external user32 name 'SetSysColors'; Здесь cElements определяет количество системных элементов, цвет которых требуется изменить; IpaElements - указатель на целочисленный массив VC++ который содержит индексы изменяемых элементов; IpaRgbvalues ссылается на целочисленный массив VC++ новых значений цвета в формате RGB. Версия VB записывается так: Declare Function SetSysColors Lib "user32" ( _ ByVal nChanges As Long, _ IpSysColor As Long, _ IpColorValues As Long _ ) As Long Здесь, перед тем как вызывать функцию, необходимо задать первые элементы для каждого массива-параметра. И наконец, заметим, что обе функции возвращают нуль в случае успешного завершения и устанавливают значение GetLastError. В следующем примере исходный цвет строки заголовка активного окна будет изменяться на красный каждые полсекунды. Public Function FlashTitleBarColor() Dim i As Integer Dim Iret As Long Dim SaveColor As Long Dim IIndices(0 To 0] As Long Dim INewColors(0 To 0) As Long ' Получим и сохраним текущий цвет. SaveColor = GetSyscolor (COLOR_ACTIVECAPTION) Debug.Print "Current color:" & Hex(SaveColor) Fori = 1 To 5 ' Изменяем цвет на красный. IIndices (0) = COLOR_ACTIVECAPTION INewColors(0) = &HFF Iret = SetSysColors(1&, IIndices(0), INewColors(0)) If Iret = 0 Then RaiseApiErrorErr.LastDllError End If Delay 0.5 ' Восстанавливаем исходный цвет. IIndices(0) = COLOR_ACTIVECAPTION INewColors(0) = SaveColor Iret = SetSysColors(1&, IIndices(0), INewColors(0)) If Iret =0 Then RaiseApiErrorErr.LastDllError End If Delay 0.5 Next EndFunction Подпрограмма Delayимеет следующий код: Sub Delay(rTime As Single) ' Задержка на rTime с (min=.01, max-300). Dim OldTime As Variant ' Береженогобогбережет. If rTime < 0.01 Or rTime > 300 Then rTime = 1 OldTime = Timer Do DoEvents Loop Until Timer - OldTime >= rTime End Sub Функции для работы со временем Во внутренней работе Windows используется универсальное координированное время UTC (Universal Coordinated Time); также встречается термин GMT, то есть «среднее время по Гринвичу» (Greenwich Mean Time), поскольку за точку отсчета принят Гринвич, Англия. Преобразования между системным и местным временем в Windows осуществляются при помощи поправок для местного часового пояса, заданного в системе. Функции Win32 позволяют работать как в местном, так и в системном времени и преобразовывать их по мере необходимости. Win32 также включает ряд функций для работы с файловым временем и датой, то есть временем и датой файлов, хранящимися в файловой системе Функции Windows, предназначенные для получения информации о времени, перечислены ниже Следует учитывать, что во внутреннем представлении системы время изменяется в тактах таймера, продолжительность которых может изменяться в зависимости от используемого процессора и операционной системы. Интервал измерения времени в Win32 обычно занимает от 10 до 15 миллисекунд. Длительность такта определяет точность результатов, возвращаемых этими функциями. Основные функции Windows для работы со временем
СОДЕРЖАНИЕ ОТЧЕТА Постановка задачи. Краткое изложение теоретических основ интерфейса прикладных программ (API Win32) и библиотеки динамической компоновки (DLL). Разработать программное обеспечение приложения, обеспечивающего получение следующей системной информации: Имя компьютера, имя пользователя; Пути к системным каталогам Windows; Версия операционной системы; Системные метрики ( не менее 10 метрик); Системные параметры:
Системные цвета (определить цвет для следующих символьных констант и изменить его на любой другой)
Функции для работы со временем:
Дополнительные API-функции :
Примеры разработанных приложений (результаты и тексты программ). |