ФУНКЦИЙ 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. 

Вы здесь: Главная Основы ABL ФУНКЦИЙ SHARED OBJECT БИБЛИОТЕК