AstraRegul
Релиз 2024.08.31.00
×

Вызов внешних функций

 
Чтобы вызывать функции, определенные в сторонних динамических библиотеках (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 = "Произошла ошибка";
 
Передача параметров по ссылке выполняется через символ &.