Access 2002

Первый байт строки


Однако помещаемый в стек адрес по-прежнему указывает на первый байт строки. Вот как все это выглядит:

Может показаться, что эти два типа данных совместимы, но это не так. Если только DLL-функция не предназначена для работы именно с типом BSTR, ей нужно передавать LPSTR-строки. Как же это сделать? Как сказать VBA, чтобы он передал функции строку типа LPSTR? Достаточно просто включить в объявление параметра функции ключевое слово ByVal. Не думайте, что в этом случае VBA передаст строку по значению, то есть поместит ее прямо в стек. Для строк это просто невозможно — они всегда передаются по ссылке. А вот тип этой ссылки определяется тем, как вы объявите параметр. Ключевое слово ByVal означает передачу функции параметра LPSTR, его отсутствие — передачу параметра BSTR.Что собой представляет константа vbNullString

Несколько выше, в разделе «Использование константы vbNullString» рассказывалось о том, что в строковом параметре можно передать DLL-функции значение Nul 1, то есть указатель со значением 0 (таким образом мы удаляли метку тома — по крайней мере, в Windows NT). Как же можно передать указатель Null? Пустую строку не передашь, поскольку Null будет указывать на конкретную строку нулевой длины в памяти. (Как вы помните, строки всегда передаются по ссылке.) Вот к чему приведет передача функции пустой строки:

С другой стороны, чтобы передать вторым аргументом Nul 1, вам нужно, чтобы стек выглядел так:

Как видите, эти две схемы не одинаковы. На первой схеме второй элемент стека указывает на нуль-символ, а на второй схеме этот элемент содержит значение 0 — это и есть указатель Nul 1. Так как же передать функции такой указатель? Для этого нужно передать ей константу vbNullString.

Комментарии закрыты