Как передать строку обратно в labview с помощью узла функции библиотеки вызовов
Вопрос
Я хочу использовать узел функций библиотеки вызовов LabVIEW для доступа к функции DLL, и эта функция возвращает строку, отображаемую на моем ВП. Как бы я поступил так? Я очень рад возвращению чисел из моей DLL, но я действительно изо всех сил пытаюсь найти какие-либо примеры того, как вернуть строку.
Решение
Я предполагаю из вашего вопроса, что у вас уже есть DLL, которая может возвращать числа в Labview. Чтобы вернуть строку из библиотеки DLL, я создал библиотеку DLL со следующей функцией C ++
void returnString(char myString[])
{
const char *aString = "test string";
memcpy(myString, aString, 12);
}
В Labview я затем использую узел функций библиотеки вызовов и настраиваю его следующим образом
Library Name or Path: c:\path\to\my\custom.dll Function Name: returnString Calling Convention: C Parameters: Parameter: return type type: void Parameter: arg1 type: String string format: C String Pointer Function prototype: void returnString(CStr arg1);
После подключения выхода arg1 на блок-диаграмме к строковому индикатору и запуска. Строка " тестовая строка " должен появиться на передней панели. Р>
Я попытался сделать функцию returnString типа CStr, как в
CStr returnString()
{ ...
}
но я получил ошибки сборки при компиляции проекта DLL.
ОбновитьБлагодаря комментарию @ bk1e не забудьте предварительно выделить место в Labview для строки.
Другие советы
Есть как минимум несколько способов вернуть строку из узла функции библиотеки вызовов:
<Ол>Верните указатель строки C из вашей функции DLL и настройте узел функции библиотеки вызовов, чтобы иметь тип возвращаемого значения " C String Pointer " ;. Обратите внимание, что возвращаемая строка должна быть действительной после возврата функции, поэтому она не может быть указателем на строку, расположенную в стеке. Он должен быть одним из следующих: размещаться в куче, статически размещаться, константный строковый литерал и т. Д.
Похоже, что examples / dll / regexpr / Regular Expression Solution / VIs / Get Error String.vi
в каталоге LabVIEW использует такой подход.
Выделите строку в своем ВП, передайте ее в узел функции библиотеки вызовов с помощью " C String Pointer " параметр, как предложил Azim, и перезаписать его содержимое в DLL. Один из способов выделения строки - использовать Initialize Array для создания массива u8 нужного размера, а затем использовать Byte Array To String для преобразования его в строку.
Убедитесь, что строка, которую вы передаете, достаточно велика, чтобы вместить содержимое вашей строки, и не забудьте передать длину строки в DLL, чтобы она знала, насколько велик буфер. Я считаю, что параметром по умолчанию является пустая строка. Для определения правильной длины строки может потребоваться дважды вызвать DLL, если первое предположение вашего ВП недостаточно велико.
Передайте строку в узел функции библиотеки вызовов, используя " String Handle " параметр, и используйте функции LabVIEW в вашей DLL, чтобы изменить размер строки по мере необходимости. Для этого требуется, чтобы ваша DLL была специально разработана для взаимодействия с LabVIEW, а также для связи со статической библиотекой, которая поставляется с LabVIEW.
Пример этого метода поставляется с LabVIEW как examples / dll / hostname / hostname.vi
.