Access 2002

Из формата BSTR в формат LPSTR


Во втором вызове функции VBA получает следующую информацию:

информация передается по ссылке;

информация представляет собой строку;

эта строка должны быть преобразована из формата BSTR в формат LPSTR.

То, что вы передаете строку, — очевидно, по ссылке строки передаются всегда, а вот на необходимость преобразования строки из формата BSTR в формат LPSTR указывает ключевое слово ByVal. Поскольку в оператор Declare это ключевое слово не вошло, в вызове функции оно необходимо, иначе строка будет передана как BSTR.

Типом данных Any нужно пользоваться очень осторожно, поскольку во время компиляции VBA не проверяет тип передаваемых вами данных. В качестве альтернативы можете объявить функцию дважды, с разными именами и конкретными типами аргументов. Например, следующий фрагмент кода объявляет две версии функции WinHelp, в одной из которых параметр dwData имеет тип Long, а в другой — String:

Когда вы вызываете функцию Windows API из VBA, в ходе ее выполнения может произойти ошибка. В результате функция вернет некоторое специальное значение вроде 0 или Fal se. Если бы этот вызов был сделан из С, вы могли бы затем вызвать функцию GetLastError, чтобы выяснить, что случилось. Можно ее вызвать и из VBA, но, к сожалению, это не даст нужного результата. Дело в том, что после вашего вызова DLL-функции VBA сам делает несколько вызовов Windows API. В результате к тому времени, как вы получите возможность обратиться к GetLastError, она сможет вернуть только информацию о последнем вызове, сделанном VBA, а не вами. Для решения этой проблемы в VBA реализовано свойство LastDLLError объекта Err. Сразу же после вашего вызова VBA присваивает этому свойству код произошедшей ошибки, откуда вы можете его прочитать. Так что вместо функции GetLastError пользуйтесь свойством LastDLLError объекта Err:

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