Основы офисного программирования и язык VBA

         

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


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

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

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

Пример 6.3.

(html, txt)

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

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

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

Пример 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


В результате выполнения функции будут заполнены поля этой структуры, содержащие всю необходимую информацию об используемой версии операционной системы. Конечно, необходимо в раздел объявлений включить и объявление типа OSVERSIONINFO. Возвращаемый функцией результат позволяет проанализировать успешность ее выполнения.
  • Процедура GlobalMemoryStatus имеет единственный, передаваемый по ссылке параметр типа MEMORYSTATUS. В результате выполнения процедуры поля структуры заполняются собранной информацией об объеме физической и виртуальной памяти, общей и доступной для использования в текущий момент, размере слова и некоторых других характеристиках памяти.
  • Процедура 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.

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

    Windows NT 4.0 (Build 1381)

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

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

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

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

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

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

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

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

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

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

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


    Содержание раздела