- •Создание динамических структур данных
- •Встроенный динамический класс Collection
- •Создание собственных динамических классов
- •Обертывание коллекции vba
- •Несколько слов об api, Win32, dll
- •Вызов функций и оператор Declare
- •Две кодировки ansi и Unicode
- •Два языка: c и vb. Различия при вызове функций
- •Соответствие между простыми типами данных
- •Структуры языка c и тип, определенный пользователем, в языке vba
- •Об описателях языка c и объектах Windows
- •Void функции языка c
- •Вызов аргументов по ссылке ByRef и по значению ByVal
- •Строковые аргументы при вызове функций Win32 api
- •Примеры работы с Win32 api функциями
- •Работа с окнами
- •Характеристики окружения
- •Вызов функций Win32 api, работающих в Unicode кодировке
- •Обработка ошибок, возникающих при вызове функций Win32 api
- •Функции api и вызов Callback функций
- •Функции высших порядков и конструкция AddressOf
- •Функции перечисления Win32 api
- •Функция EnumWindows
- •Еще один пример работы с функцией EnumWindows
- •Функции Win32 api для работы с таймером
- •Функция SetTimer
- •Функция обратного вызова TimerProc
- •Функция KillTimer
- •Пример создания, работы и удаления таймера
- •Классы как обертка вызовов функций Win32 api
- •Построение класса "ВашТаймер"
- •Использование класса ВашТаймер
- •Операторы
- •Операторы и строки
- •Оператор комментария
- •Присваивание
- •Оператор Let
- •Оператор lSet
- •Оператор rSet
- •Оператор Set
- •Управляющие операторы
- •Условный оператор If Then Else End If
- •Оператор выбора Select Case
- •Цикл For Next
- •Цикл Do...Loop
- •Цикл While...Wend
- •Цикл For Each...Next
- •Работа с каталогами, папками и файлами
- •Изменение текущего диска: оператор ChDrive
- •Изменение текущего каталога (папки): оператор ChDir
- •Создание каталога (папки): оператор MkDir
- •Переименование каталогов (папок) и файлов: оператор Name
- •Удаление каталога (папки): оператор RmDir
- •Установка атрибутов файла: оператор SetAttr
- •Копирование файлов: оператор FileCopy
- •Удаление файлов: оператор Kill
- •Прочие операторы
- •Операции с одним объектом. Оператор With
- •Операции
- •Работа с числовыми данными
- •Математические функции
- •Работа со строками
- •Сравнение строк
- •Сравнение с образцом
- •Основные операции над строками
- •Новые функции для работы со строками
- •Функция InStrRev - поиск последнего вхождения подстроки
- •Функция Replace - замена всех вхождений подстроки
- •Удаление подстроки
- •Разбор строки. Функции Split, Join и Filter
- •Преобразование строки в массив. Функция Split
- •Сборка элементов массива в строку. Функция Join
- •Фильтрация элементов массива. Функция Filter
- •Несколько модификаций встроенных функций
- •Замена, основанная на шаблоне. Функция WildReplace
- •Замена разных символов строки. Функция CharSetReplace
- •Фильтрация, основанная на шаблоне. Функция WildFilter
- •Разбор строки, допускающей разные разделители ее элементов. Функция WildSplit
- •Работа с датами и временем
- •Присваивание значений
- •Встроенные функции для работы с датами
- •Определение текущей даты или времени.
- •Вычисления над датами
- •Функция Timer и хронометраж вычислений
- •Некоторые встроенные функции
- •Функции проверки типов данных
- •Преобразование типов данных
- •Форматирование данных. Функции группы Format
- •Функция Format.
- •Другие функции форматирования
- •Описание и создание процедур
- •Классификация процедур
- •Синтаксис процедур и функций
- •Функции с побочным эффектом
- •Создание процедуры
- •Создание процедур обработки событий
- •Вызовы процедур и функций Вызовы процедур Sub
- •Вызовы функций
- •Использование именованных аргументов
- •Аргументы, являющиеся массивами
- •Конструкция ParamArray
- •Задача о медиане
- •Пользовательские функции, принимающие сложный объект Range
- •Рекурсивные процедуры
- •Деревья поиска
- •Класс TreeNode
- •Класс BinTree
- •Работа со словарем
- •Отладка
- •Написание надежных программ
- •Искусство отладки
- •Средства отладки
- •Панель отладки и команды меню
- •Окна наблюдения
- •Окно локальных переменных - Locals
- •Окно проверки - Immediate
- •Окно контрольных выражений - Watch
Характеристики окружения
Наш следующий пример показывает, как получить, используя вызов 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:
-
Функция GetVersionEx имеет в качестве единственного параметра, передаваемого по ссылке, структуру типа OSVERSIONINFO. В результате выполнения функции будут заполнены поля этой структуры, содержащие всю необходимую информацию об используемой версии операционной системы. Конечно, необходимо в раздел объявлений включить и объявление типа 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. (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