Как передать строку обратно в labview с помощью узла функции библиотеки вызовов

StackOverflow https://stackoverflow.com/questions/269062

  •  06-07-2019
  •  | 
  •  

Вопрос

Я хочу использовать узел функций библиотеки вызовов 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 .

  • Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top