Visual Basic 6. Руководство разработчика


Параметры 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), так как они указывают на область памяти, в которой хранится значение переменной.

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