Вызов внешних функций
Чтобы вызывать функции, определенные в сторонних динамических библиотеках (DLL-файлах), используйте тип действия Вызывать внешнюю функцию в Редакторе функций.
Параметры вызова внешней функции
Параметр
|
Описание
|
Имя модуля
|
Абсолютный путь до DLL-файла. Если DLL- файл расположен в корне каталога с установленным Astra.HMI, то достаточно указать его имя без пути
|
Имя функции
|
Имя вызываемой функции, которая определена в файле динамической библиотеки
|
Тип вызова
|
Способ вызова функции CDecl или StdCall (Win API). Зависит от спецификации вызываемой внешней функции
|
Кодировка
|
Кодировка символов:
UTF8
UTF16
ANSI
|
Опции маршаллинга
|
Настройки направления работы аргументов (входной, выходной или с применением буфера). Все аргументы по умолчанию - входные. Если аргумент выходной, то это нужно указать в опциях маршаллинга: ["out"], если входной/выходной - ["in", "out"]. Если выходной аргумент типа string, то опции маршаллинга: ["out", "buffer"].
|
Пример
Разберем детально процесс вызова внешней функции ExtLibCalcNoErrorDesc, которая определена в файле extlib.dll.
Ниже показан фрагмент исходного кода динамической библиотеки:
std::int32_t __stdcall ExtLibCalcNoErrorDesc(
wchar_t const *inputString,
double a1,
double x1,
double a2,
double x2,
double *y1,
double *y2)
{
try
{
//Проверяем входные параметры
If( !inputString ) throw Error( L"Не указана входная строка" );
// Считаем выражения
*y1 = a1 * x1 + a2 * x2;
*y2 = ( 1 / a1 ) * x1 - ( 1 / a2 ) * x2;
// Всё прошло успешно, вернуть 1
return 1;
}
// Ловим ошибку и возврщаем 0
catch( Error const &e )
{
return 0;
}
}
|
Создайте новую функцию ExtLibCalcNoErrorDesc и настройте параметры:
Тип возвращаемого значения выберите в соответствии с типом возвращаемого значения самой функции - это int4;
Перечень входных аргументов настройте в соответствии с типами входных аргументов самой функции: первый аргумент строковый, все остальные - тип float8;
Два последних аргумента функции являются ссылочными - отметьте их соответствующими флагами в колонке Ссылка;
Выберите в выпадающем списке действие Вызывать внешнюю функцию;
Укажите Имя модуля - название файла, из которого будет вызываться внешняя фукнция - extlib.dll;
Укажите Имя функции, которую требуется вызывать - ExtLibCalcNoErrorDesc;
Укажите Тип вызова. Для вызываемой функции - StdCall(Win API);
Укажите кодировку - Utf16;
Укажите Опции маршалинга в формате: {"имя параметра": ["in","out","buffer"]}.
Ниже показан участок кода, вызывающий внешнюю функцию из скриптов:
//Готовим входные параметры для внешней функции
inp_str: string = "входная строка";
a1: double = 0.5;
a2: double = 0.75;
x1: double = 0.25;
x2: double = 0.01;
_y1: double = 0;
_y2: double = 0;
//Вызвать внешнюю функцию и присвоить результат выполнения переменной Result
Result: ExtLibCalcNoErrorDesc (inp_str, a1, x1, a2, x2, &_y1, &_y2);
//Обработка результатов выполнения функций
if(Result == 0) TextField.Text = "Произошла ошибка";
|
Передача параметров по ссылке выполняется через символ &.
|