Access 2002

Возврат строк из DLL


В таблице имеются поля для имен констант, их значений и описаний. В запросе, который служит источником записей формы, для формирования данных последнего столбца вызывается функция GetSystemMetrics, которой передается значение константы из каждой строки таблицы.

В Windows строки могут храниться двумя способами, известными программистам С как BSTR и LPSTR. Далее в этой главе в разделе «Передача строк в DLL: что происходит на самом деле» рассказывается о том, какова внутренняя структура этих двух видов строк. Все функции Windows API, за исключением тех, что имеют дело непосредственно с СОМ, работают со строками LPSTR. Длина такой строки после ее создания уже не может быть изменена. Это усложняет возврат строк функциями DLL: фактически эти функции не возвращают содержимое строк, а просто модифицируют переданные им строки в памяти.

Поскольку функция DLL не может изменить размер переданной ей строки, эта строка должна быть создана достаточно большой, чтобы вместить все возвращаемые данные. Для программиста VBA это значит, что строку перед передачей ее DLL нужно заполнить достаточным количеством символов, чтобы получился буфер нужного размера. Обычно это делается с помощью функции VBA Space. DLL не должна записывать данные за пределами строки, поскольку это может привести к ошибке общей защиты. Как правило, DLL-функции, которые модифицируют строку, требуют передачи им еще одного параметра, указывающего, сколько места вы выделили для переданной строки. (Это кажется странным, но большинство DLL-функций не настолько сообразительны, чтобы определить размер текстового буфера самостоятельно.)

Примером функции Windows, манипулирующей строкой данных в памяти, является функция GetWindowText:

Вы передаете ей дескриптор окна, и она записывает в буфер текст, связанный с этим окном.

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