При использовании API-функций необходимо предусмотреть объявление функций и их параметров. Win32 API предназначен для программистов, работающих на языке С или С ++. Поэтому в документации используются структуры данных, принятые в С. Их необходимо преобразовать к их эквивалентам в Visual Basic. В табл. 13.1 приведены объявления, предусмотренные в языке С, и соответствующие VB-эквиваленты. В последнем столбце приведено описание способа передачи параметров API-функциям. Все типы данных передаются по значению, кроме Integer Pointer и Long Integer Pointer (указатели).
Таблица 13.1.
Соответствие типов данных в С и Visual Basic
| Объявление С | Тип данных Visual Basic | Способ передачи параметров | |||
| Integer | Integer | ByVal | |||
| Integer Pointer (LPINT) | Integer | ByRef | |||
| Long | Long | ByVal | |||
| Long Integer Pointer | Long | ByRef | |||
| Stung Pointer (LPSTR) | String | ByVal | |||
| Handle | Long | ByVal | |||
| Char | String | ByVal | |||
| Void Pointer | Any | ByRef |
Передача параметров по значению
Чтобы использовать API-функции в VB-приложении, необходимо ознакомиться с двумя механизмами передачи параметров — ByVal
и ByRef. Подробно они рассмотрены в гл. 3.
Когда параметры передаются по значению, вызываемая процедура работает с локальными копиями переменных. Процедура может изменить их значения, но не саму переменную в вызывающей программе. В Visual Basic для индикации такого способа передачи используется ключевое слово ByVal. Ниже приведен текст процедуры AnySub(), в которой параметр anyNumber передается по значению, ему присваивается значение 10. При выходе из процедуры исходное значение переменной восстанавливается.
Программа 13.1. Передача параметров по значению
Sub AnySub(ByVal anyNumber as Integer)
anyNumber = 10
Debug.Print anyNumber
End Sub
Если вызвать процедуру AnySub() следующим образом,
х = 1
Call AnySub(х)
Debug.Print x
то в окне проверки появится сообщение:
AnyNumber = 10
х = 1
С помощью оператора Print в процедуре AnySub() отображается значение, присвоенное переменной anyNumber внутри процедуры (локально). Значение, присвоенное переменной х в вызывающей программе (1), также появляется в окне проверки. Значение 10, присвоенное переменной anyNumber в процедуре AnySub(), вне этой процедуры недействительно.