Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОСНОВЫ ОФИСНОГО ПРОГРАММИРОВАНИЯ И ЯЗЫК VBA - 2....doc
Скачиваний:
79
Добавлен:
17.12.2018
Размер:
1.62 Mб
Скачать

Характеристики окружения

Наш следующий пример показывает, как получить, используя вызов Win32 API функций, следующие характеристики окружения:

  • Версию используемой операционной системы.

  • Тип процессора.

  • Общий и используемый объем физической и виртуальной памяти.

Функции, используемые в этом примере, принадлежат библиотеке Kernel32. Заметьте, что в отличие от большинства случаев в данном примере будут вызываться не только функции, но и процедуры, хранящиеся в библиотеке Kernel32. Начнем с описания констант, типов и операторов Declare, предшествующих вызову API функций:

Option Explicit

'Константы

Public Const PROCESSOR_INTEL_386 = 386

Public Const PROCESSOR_INTEL_486 = 486

Public Const PROCESSOR_INTEL_PENTIUM = 586

Public Const PROCESSOR_MIPS_R4000 = 4000

Public Const PROCESSOR_ALPHA_21064 = 21064

'Типы

Type SYSTEM_INFO

dwOemID As Long

dwPageSize As Long

lpMinimumApplicationAddress As Long

lpMaximumApplicationAddress As Long

dwActiveProcessorMask As Long

dwNumberOrfProcessors As Long

dwProcessorType As Long

dwAllocationGranularity As Long

dwReserved As Long

End Type

Type OSVERSIONINFO

dwOSVersionInfoSize As Long

dwMajorVersion As Long

dwMinorVersion As Long

dwBuildNumber As Long

dwPlatformId As Long

szCSDVersion As String * 128

End Type

Type MEMORYSTATUS

dwLength As Long

dwMemoryLoad As Long

dwTotalPhys As Long

dwAvailPhys As Long

dwTotalPageFile As Long

dwAvailPageFile As Long

dwTotalVirtual As Long

dwAvailVirtual As Long

End Type

'Операторы Declare

Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" _

(LpVersionInformation As OSVERSIONINFO) As Long

Declare Sub GlobalMemoryStatus Lib "kernel32" (lpBuffer As _

MEMORYSTATUS)

Declare Sub GetSystemInfo Lib "kernel32" (lpSystemInfo As _

SYSTEM_INFO)

Пример 6.3. (html, txt)

Для сбора информации об окружении - используемом процессоре, операционной системе, имеющейся памяти и других характеристиках компьютера используем три следующие функции (процедуры) Win32 API:

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

  2. Процедура GlobalMemoryStatus имеет единственный, передаваемый по ссылке параметр типа MEMORYSTATUS. В результате выполнения процедуры поля структуры заполняются собранной информацией об объеме физической и виртуальной памяти, общей и доступной для использования в текущий момент, размере слова и некоторых других характеристиках памяти.

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

Приведем теперь процедуру, в которой вызываются указанные функции API, обрабатывается полученная информация, конечные результаты выводятся в окно отладки:

Public Sub WorkWithStatus()

Dim res As Long 'Результат выполнения функции

Dim msg As String ' Формируемое сообщение

Dim verinfo As OSVERSIONINFO 'Информация об ОС и ее версиях

Dim sysinfo As SYSTEM_INFO 'Системная информация

Dim memstatus As MEMORYSTATUS 'Информация о статусе памяти

verinfo.dwOSVersionInfoSize = Len(verinfo)

res = GetVersionEx(verinfo)

If res > 0 Then

Select Case verinfo.dwPlatformId

Case 0

msg = "Windows 32s "

Case 1

msg = "Windows 95/98 "

Case 2

msg = "Windows NT "

End Select

msg = msg & verinfo.dwMajorVersion & "." & verinfo.dwMinorVersion

msg = msg & " (Build " & verinfo.dwBuildNumber & ")" & vbCrLf

Debug.Print msg

Else

MsgBox ("Не могу получить версию операционной системы")

End If

' определение типа процессора

GetSystemInfo sysinfo

msg = "Процессор: "

Select Case sysinfo.dwProcessorType

Case PROCESSOR_INTEL_386

msg = msg & "Intel 386" & vbCrLf

Case PROCESSOR_INTEL_486

msg = msg & "Intel 486" & vbCrLf

Case PROCESSOR_INTEL_PENTIUM

msg = msg & "Intel Pentium" & vbCrLf

Case PROCESSOR_MIPS_R4000

msg = msg & "MIPS R4000" & vbCrLf

Case PROCESSOR_ALPHA_21064

msg = msg & "DEC Alpha 21064" & vbCrLf

Case Else

msg = msg & "(unknown)" & vbCrLf

End Select

Debug.Print msg

msg = "Число процессоров: " & sysinfo.dwNumberOrfProcessors & vbCrLf

Debug.Print msg

msg = "Размер страницы: " & sysinfo.dwPageSize & vbCrLf

Debug.Print msg

msg = "Минимальный адрес приложения: " & sysinfo.lpMinimumApplicationAddress & vbCrLf

Debug.Print msg

msg = "Максимальный адрес приложения: " & sysinfo.lpMaximumApplicationAddress & vbCrLf

Debug.Print msg

' Получение характеристик памяти

GlobalMemoryStatus memstatus

msg = "Физическая память. Всего: " & _

VBA.Format$(memstatus.dwTotalPhys \ 1024, "###,###,###") & "K" & vbCrLf

Debug.Print msg

msg = "Физическая память. Доступно: " & _

VBA.Format$(memstatus.dwAvailPhys \ 1024, "###,###,###") & "K" & vbCrLf

Debug.Print msg

msg = "Виртуальная память. Всего: " & _

VBA.Format$(memstatus.dwTotalVirtual \ 1024, "###,###,###") & "K" & vbCrLf

Debug.Print msg

msg = "Виртуальная память. Доступно: " & _

VBA.Format$(memstatus.dwAvailVirtual \ 1024, "###,###,###") & "K" & vbCrLf

Debug.Print msg

msg = "Длина слова: " & memstatus.dwLength & vbCrLf

Debug.Print msg

msg = "Загрузка памяти: " & memstatus.dwMemoryLoad & vbCrLf

Debug.Print msg

End Sub

Пример 6.4. (html, txt)

Программа, по-видимому, не нуждается в особых комментариях, и мы ограничимся приведением результатов отладки, которые показывают мое рабочее окружение:

Windows NT 4.0 (Build 1381)

Процессор: Intel Pentium

Число процессоров: 1

Размер страницы: 4096

Минимальный адрес приложения: 65536

Максимальный адрес приложения: 2147418111

Физическая память. Всего: 32 180K

Физическая память. Доступно: 4 772K

Виртуальная память. Всего: 2 097 024K

Виртуальная память. Доступно: 1 982 872K

Длина слова: 32

Загрузка памяти: 0