Руководство разработчика

Метод БИБЛИОТЕКА_ПОСРЕДНИК. ЗАПИСАТЬ

Метод ЗАПИСАТЬ позволяет установить значения входных параметров в буфере промежуточной DLL. За один вызов метода ЗАПИСАТЬ можно установить только одно значение простого типа, например, поля структуры.

Метод ЗАПИСАТЬ можно использовать после вызова ПОДГОТОВИТЬ и до вызова метода ВЫЗВАТЬ.

ФУНКЦИЯ ЛОГИКА: ЗАПИСАТЬ(*: значение; 
                         ЦЕЛОЕ: тип_данных; 
                         ЦЕЛОЕ: вид_знач; 
                         ЦЕЛОЕ: поз = 0; 
                         СТРОКА: путь = ""; 
                         БП_ИНДЕКСЫ: индексы = ())

Параметры

значение
Устанавливаемое значение одного из следующих типов:
тип_данных
Тип данных на стороне промежуточной DLL. Задается одной из констант БП_ТИП_.... Тип параметра значение должен соответствовать заданной константе БП_ТИП_....
вид_знач
Определяет вид устанавливаемого значения. Влияет на интерпретацию параметров поз и путь. Задается константами БП_ЗНАЧ_.... Допускается использование следующих констант:
поз
Смысл параметра зависит от вид_знач:
  • БП_ЗНАЧ_ПАРАМ - номер параметра (нумерация от 1) или 0, если имя параметра включено в путь;
  • БП_ЗНАЧ_САМ - должен указываться 0;
  • БП_ЗНАЧ_ВРЕМ - номер временного значения, ранее переданный в метод ВЫДЕЛИТЬ.
путь
Определяет список имен полей вложенных структур, разделенных точкой. Если вид_знач задан как БП_ЗНАЧ_ПАРАМ, а поз равен 0, то первым элементом указывается имя параметра функции. Это позволяет обращаться к параметрам функции не по порядковому номеру, а по имени.
индексы
Определяет список индексов массивов, включая вложенность. Например, есть массив структур, где в каждой структуре есть массив чисел. Первый индекс задает позицию в массиве структур, второй - в массиве чисел этой структуры. Нумерация элементов массивов производится от нуля.

Возвращаемое значение

ДА – при успешном вызове, НЕТ – в противном случае. В случае ошибки дополнительную информацию можно получить вызовом метода ПОСЛ_ОШИБКА.

Пример

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

struct Point
{
  double x;
  double y;
};

struct Triangle
{
  Point point[3];
};

double CalcSquare(Triangle* tr);

Представим реализацию промежуточной DLL так, что параметр функции CalcSquare рассматривается как входной, а передача указателя - лишь несущественная деталь. Для заполнения входного параметра tr воспользуемся методом ЗАПИСАТЬ:

ПЕРЕМ БИБЛИОТЕКА_ПОСРЕДНИК: библ
//...
библ.ПОДГОТОВИТЬ("CalcSquare")
// здесь в буфере параметров уже создана структура Triangle - заполним ее

// запись данных с использованием номера параметра (1)
библ.ЗАПИСАТЬ(5.67, БП_ТИП_FLOAT64, БП_ЗНАЧ_ПАРАМ, 1, "point.x", (0)) // tr.point[0].x
библ.ЗАПИСАТЬ(3.13, БП_ТИП_FLOAT64, БП_ЗНАЧ_ПАРАМ, 1, "point.y", (0)) // tr.point[0].y
библ.ЗАПИСАТЬ(7.22, БП_ТИП_FLOAT64, БП_ЗНАЧ_ПАРАМ, 1, "point.x", (1)) // tr.point[1].x
библ.ЗАПИСАТЬ(2.03, БП_ТИП_FLOAT64, БП_ЗНАЧ_ПАРАМ, 1, "point.y", (1)) // tr.point[1].y

// запись данных с использованием имени параметра (tr)
библ.ЗАПИСАТЬ(0.32, БП_ТИП_FLOAT64, БП_ЗНАЧ_ПАРАМ, 0, "tr.point.x", (2)) // tr.point[2].x
библ.ЗАПИСАТЬ(1.43, БП_ТИП_FLOAT64, БП_ЗНАЧ_ПАРАМ, 0, "tr.point.y", (2)) // tr.point[2].y

// вызываем функцию CalcSquare
библ.ВЫЗВАТЬ

// получаем площадь
ПЕРЕМ ЧИСЛО: площадь
библ.СЧИТАТЬ(площадь, БП_ТИП_FLOAT64, БП_ЗНАЧ_РЕЗУЛЬТАТ)

библ.ОЧИСТИТЬ

Для иллюстрации работы со временными значениями и указателями представим реализацию промежуточной DLL "в лоб". При реализации "в лоб" функция CalcSquare принимает входной параметр типа указатель на треугольник. Создадим временное значение типа Triangle, заполним его и передадим указатель функции CalcSquare:

ПЕРЕМ БИБЛИОТЕКА_ПОСРЕДНИК: библ
//...
библ.ПОДГОТОВИТЬ("CalcSquare")
// здесь в буфере параметров нулевой указатель на Triangle

КОНСТ врем_треуг = 42 // произвольное число, идентификатор временного значения
// получаем указатель на треугольник в строковом виде (например, "0x1B32FA35")
ПЕРЕМ СТРОКА: указатель_на_треуг = библ.ВЫДЕЛИТЬ(врем_треуг, БП_ТИП_СТРУКТУРА, "Triangle")

// запись данных во временное значение
библ.ЗАПИСАТЬ(5.67, БП_ТИП_FLOAT64, БП_ЗНАЧ_ВРЕМ, врем_треуг, "point.x", (0)) // point[0].x
библ.ЗАПИСАТЬ(3.13, БП_ТИП_FLOAT64, БП_ЗНАЧ_ВРЕМ, врем_треуг, "point.y", (0)) // point[0].y
библ.ЗАПИСАТЬ(7.22, БП_ТИП_FLOAT64, БП_ЗНАЧ_ВРЕМ, врем_треуг, "point.x", (1)) // point[1].x
библ.ЗАПИСАТЬ(2.03, БП_ТИП_FLOAT64, БП_ЗНАЧ_ВРЕМ, врем_треуг, "point.y", (1)) // point[1].y
библ.ЗАПИСАТЬ(0.32, БП_ТИП_FLOAT64, БП_ЗНАЧ_ВРЕМ, врем_треуг, "point.x", (2)) // point[2].x
библ.ЗАПИСАТЬ(1.43, БП_ТИП_FLOAT64, БП_ЗНАЧ_ВРЕМ, врем_треуг, "point.y", (2)) // point[2].y

// заносим значение указателя в параметр функции
библ.ЗАПИСАТЬ(указатель_на_треуг, БП_ТИП_УКАЗАТЕЛЬ, БП_ЗНАЧ_ПАРАМ, 1)

// вызываем функцию CalcSquare
библ.ВЫЗВАТЬ

// получаем площадь
ПЕРЕМ ЧИСЛО: площадь
библ.СЧИТАТЬ(площадь, БП_ТИП_FLOAT64, БП_ЗНАЧ_РЕЗУЛЬТАТ)

библ.ОЧИСТИТЬ

См. также: