Параметры API-функций
При использовании 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(), вне этой процедуры недействительно.
Передача параметров по ссылке
При передаче параметров по ссылке процедуре предоставляется доступ к переменной в вызывающей программе. Процедура, параметр которой передается таким образом, получает адрес области памяти, хранящей значение параметра. Это дает ей возможность изменять значение параметра. В Visual Basic такой механизм передачи значений параметров устанавливается по умолчанию. В следующем примере процедура AnySub() изменяет значение параметра.
Программа 13.2. Передача параметров по ссылке
Sub AnySub(mylnt As Integer)
mylnt
= 20 ' теперь переменная mylnt имеет значение 20
End
Sub
Если теперь вызвать эту процедуру,
Dim x
As Integer
{Требуемые операторы}
х
= 4
Debug.Print "Before calling AnySub x = " &
x
' (Перед вызовом AnySub x
=...)
Call AnySub(x)
Debug.Print "After calling AnySub x = " & x
' (После вызова AnySub x
=...)
то в окне Debug появятся следующие строки:
{Перед вызовом AnySub х = 4
После вызова AnySub х = 20
Изменение значения переменной х процедурой AnySub() носит глобальный характер, поскольку значение параметра передавалось по ссылке. Если нет оснований разрешать вызываемой процедуре глобальное изменение значений параметров, то параметры необходимо передавать по значению. Некоторые API-функции сохраняют результаты работы, изменяя значения переданных им параметров, поэтому предполагается, что параметр такой функции должен передаваться по ссылке. В языке С такие параметры называются указателями (pointers), так как они указывают на область памяти, в которой хранится значение переменной.