ФУНКЦИЙ SHARED OBJECT БИБЛИОТЕК
В OpenEdge ABL возможно использование функций из состава Shared Object библиотек для Unix и DLL для Windows.
Для примера, создадим файл test.c и опишем в нем простую функцию externalFunction на языке СИ. В качестве входного параметра данная функция будет принимать целочисленное значение, увеличивать его на 10 и возвращать полученный результат.
int externalFunction(int x) {
int y = x + 10;
return y;
}
Скомпилируем получившийся файл test.c. Для этого в консоли в каталоге с файлом test.c выполним следующую команду:
# gcc -fPIC -c test.c
В результате на выходе, в том же каталоге, мы получим скомпилированный файл test.o. Далее нам необходимо создать библиотеку включив в нее нашу функцию. Для этого, в консоли выполним следующую команду:
# gcc -shared -o libtest.so test.o
В результате мы получим файл библиотеки libtest.so. Теперь самое время осуществить вызов externalFunction из процедуры ABL.
DEF VAR vReturnValue AS INT NO-UNDO.
RUN externalFunction(INPUT 65, OUTPUT vReturnValue).
DISPL vReturnValue.
PROCEDURE externalFunction EXTERNAL "libtest.so":
DEF INPUT PARAM x AS LONG NO-UNDO.
DEF RETURN PARAM y AS LONG NO-UNDO.
END.
Для того чтобы воспользоваться сторонней функцией ее необходимо определить в ABL. Определяется она как внутренняя процедура с опцией EXTERNAL указывающей на то, что данная функция является сторонней, с указанием библиотеки в состав которой она входит.
Возвращаемое функцией значение определяется параметром с типом RETURN. Тип данных параметров указываются согласно таблице приведенной ниже. Так как в СИ наша функция принимает и возвращает значения int типа, то согласно таблице, при объявлении ее в ABL параметры должны быть LONG типа.
Тип данных СИ | Тип данных параметра ABL SO (DLL) процедуры | Размер данных |
char | BYTE | 8-bit unsigned integer |
short | SHORT | 16-bit signed integer |
unsigned short | UNSIGNED-SHORT | 16-bit unsigned integer |
int | LONG | 32-bit signed integer |
long (32-bit UNIX, Win32) | ||
unsigned int | UNSIGNED-LONG | 32-bit unsigned integer |
_int64 (Win32) | INT64 | 64-bit signed integer |
long long (UNIX 32-bit) | ||
long (UNIX 64-bit) | ||
float | FLOAT | 4-byte floating point |
double | DOUBLE | 8-byte floating point |
char* | CHARACTER | Address (32 bits for 32-bit platforms, 64 bits for 64-bit platforms.) |
c-data-type | HANDLE TO parameter-data-type | Address (32 bits for 32-bit platforms, 64 bits for 64-bit platforms.) |
char*, output-pointer (which can be char**, short**, and so on), or a pointer to a structure | MEMPTR | Address (32 bits for 32-bit platforms, 64 bits for 64-bit platforms.) |
Вызов сторонней функции осуществляется аналогично вызову внутренней процедуры ABL. Если при объявлении функции был указан RETURN параметр, то при ее вызове в операторе RUN данный параметр должен быть указан как OUTPUT.