На главную страничку учебника Visual BasicВызов DLL При вызове процедуры DLL имеется несколько аспектов, связанных с передачей параметров. Они включают:
Передача нулевых значений Когда процедура DLL принимает параметр с пустым значением, она ожидает нулевое значение (0) вместо пустой строки (NULL). Чтобы передать пустое значение, следует объявить параметр ByVal As String и передать константу vbNullString, как показано в следующем примере: Declare
Function FindWindow
Lib "User32" Alias
"FindWindowA" _ 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 или 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 Определить строку фиксированной длины с максимально возможной длиной: Dim FilePath As String * 255 Строки, возвращаемые процедурой DLL, в конце строки содержат символ пробела. При объединении нескольких строк потребуется удалять этот символ пробела. Так как имеются процедуры, которые возвращают целое число, указывающее длину строки, можно либо использовать функцию Left, чтобы удалить символ пробела, либо искать символ пробела, используя Chr(0). Пример передачи строкового значения Процедура GetWindowsDirectory используется для возвращения пути папки Windows. При этом для пути папки Windows необходимо обеспечить пустую строку достаточной длины, чтобы принять самое длинное возможное имя папки. Процедура GetWindowsDirectory возвращает целое число, которое указывает фактическое число символов в изменяемой строке. Эта строка будет содержать NULL в качестве последнего символа. NULL можно удалить, найдя его или используя функцию Left, как показано в следующем примере: Declare
Function
GetWindowsDirectory Lib "Kernel32"
_ Sub Commandl_Click () Dim
sWinDir As String End Sub На главную страничку учебника Visual Basic |