Идёт загрузка страницы...

htp://aptem.net.ru






На главную страничку учебника Visual Basic

Вызов DLL

При вызове процедуры DLL имеется несколько аспектов, связанных с передачей параметров. Они включают:

  • передача в процедуру DLL пустого значения;
  • выбор передачи параметров с их значением или по ссылке на это значение;
  • обеспечение в Visual Basic строк, размер которых достаточен для размещения строк С.

Передача нулевых значений

Когда процедура DLL принимает параметр с пустым значением, она ожидает нулевое значение (0) вместо пустой строки (NULL). Чтобы передать пустое значение, следует объявить параметр ByVal As String и передать константу vbNullString, как показано в следующем примере:

Declare Function FindWindow Lib "User32" Alias "FindWindowA" _
(ByVal IpClassName As String, ByVal IpCaption As String) As Long

re = FindWindow (vbNullString, "Microsoft Word")

Примечание: В Visual Basic версии 3.0 единственым способом передать пустое значение было ByVal 0&. Если использовались DLL, которые требовали строку или NULL, нужно было либо объявить параметр As Any, либо объявить DLL дважды, один раз с параметром String и второй раз — с параметром Long.

Передача параметров по значению и по ссылке

Visual Basic передает параметры процедурам по ссылке, используя 32-разрядный адрес значения данного, или по значению, используя фактическое значение переменной параметра.

По умолчанию, Visual Basic передает параметры по ссылке. Однако многие процедуры DLL ожидают, что параметры будут переданы по значению. Если параметр передается неправильно (например, если передается значение в процедуру, которая ожидает адрес), это может обусловить блокировку по общей защите.

Передача параметров по значению

При передаче параметра по значению процедуре передается копия оригинального значения данного. Если процедура изменяет значение, на оригинальную переменную это изменение не воздействует.

Чтобы передать параметр по значению, необходимо в операторе Declare перед объявлением параметра поместить ключевое слово ByVal, как показано в следующем фрагменте:

Declare Function FlashWindow Lib "User32" _
(ByVal hwnd As Long, ByVal binvert As Long) As Long

Передача параметров по ссылке

При передаче параметра по ссылке в процедуру передается адрес памяти оригинальной переменной. Если процедура изменяет значение этой переменной, оригинальное значение также изменяется.

В объявлении процедуры можно специфицировать ByVal или ByRef. Если ключевое слово не специфицируется, Visual Basic автоматически передает параметры по ссылке. Хотя включать ByRef в объявлении не требуется, текст кода будет более читабельным, если явно используется или ByRef, или ByVal.

Передача строковых значений

Строковые типы данных в Visual Basic хранятся в формате, отличном от эквивалентных типов данных языка С. Большинство DLL и все процедуры в Windows API распознают формат строки языка С. При передаче строковых значений в Visual Basic необходимо учитывать эти различия, объявляя строковые параметры по значению, принимая во внимание при этом различия в длине строковых значений.

Объявление строковых параметров по значению

Если процедура DLL ожидает в качестве параметра строку формата С, необходимо объявить параметр Visual Basic как String, которому предшествуют ключевое слово ByVal. Значение строковой переменной — это фактически указатель на область в памяти, которая содержит строку. Следовательно, процедура DLL может изменять строковую переменную Visual Basic, полученную как параметр.

Учет различий в длине строк

DLL не может увеличить длину строки Visual Basic и производит запись вне конца строки, если она недостаточно длинная. Чтобы обеспечить достаточно пространства для строки любой длины, можно использовать один из следующих методов:

Заполнить символьную строку максимальным ожидаемым числом символов:

Dim FilePath As String
FilePath = String (255, 0)

Определить строку фиксированной длины с максимально возможной длиной:

Dim FilePath As String * 255

Строки, возвращаемые процедурой DLL, в конце строки содержат символ пробела. При объединении нескольких строк потребуется удалять этот символ пробела. Так как имеются процедуры, которые возвращают целое число, указывающее длину строки, можно либо использовать функцию Left, чтобы удалить символ пробела, либо искать символ пробела, используя Chr(0).

Пример передачи строкового значения

Процедура GetWindowsDirectory используется для возвращения пути папки Windows. При этом для пути папки Windows необходимо обеспечить пустую строку достаточной длины, чтобы принять самое длинное возможное имя папки.

Процедура GetWindowsDirectory возвращает целое число, которое указывает фактическое число символов в изменяемой строке. Эта строка будет содержать NULL в качестве последнего символа. NULL можно удалить, найдя его или используя функцию Left, как показано в следующем примере:

Declare Function GetWindowsDirectory Lib "Kernel32" _
Alias "GetWindowsDirectoryA" _
(ByVal f As String, ByVal fLen As Long) As Long

Sub Commandl_Click ()

Dim sWinDir As String
Dim
ILen As Long
sWinDir = String(255,0)
ILen = GetWindowsDirectory (sWinDir, Len (sWinDir))
sWinDir = Left (sWinDir, ILen)
sWinDir = sWinDir + "\"
MsgBox "Windows находится в " + sWinDir

End Sub

На главную страничку учебника Visual Basic