Как передать строку обратно в labview с помощью узла функции библиотеки вызовов - PullRequest
4 голосов
/ 06 ноября 2008

Я хочу использовать узел функций библиотеки вызовов LabVIEW для доступа к функции DLL, и эта функция должна возвращать строку, отображаемую на моем ВП. Как бы я поступил так? Я очень рад, что возвращаю числа из моей DLL, но действительно изо всех сил пытаюсь найти примеры того, как вернуть строку.

Ответы [ 2 ]

3 голосов
/ 07 ноября 2008

Существует как минимум несколько способов вернуть строку из узла функции библиотеки вызовов:

  1. Вернуть указатель строки C из вашей функции DLL и сконфигурировать узел функции библиотеки вызовов, чтобы иметь тип возвращаемого значения "Указатель строки C". Обратите внимание, что возвращаемая строка должна быть действительной после возврата функции, поэтому она не может быть указателем на строку, расположенную в стеке. Он должен быть одним из следующих: размещаться в куче, статически размещаться, константный строковый литерал и т. Д.

    Похоже, examples/dll/regexpr/Regular Expression Solution/VIs/Get Error String.vi в каталоге LabVIEW использует такой подход.

  2. Выделите строку в своем ВП, передайте ее в узел функции библиотеки вызовов, используя параметр «C String Pointer», как предложено Azim, и перезапишите ее содержимое в DLL. Один из способов выделения строки - использовать Initialize Array для создания массива u8 нужного размера, а затем использовать Byte Array To String для преобразования его в строку.

    Убедитесь, что строка, которую вы передаете, достаточно велика, чтобы вместить содержимое вашей строки, и не забудьте передать длину строки в DLL, чтобы она знала, насколько велик буфер. Я считаю, что параметром по умолчанию является пустая строка. Для определения правильной длины строки может потребоваться дважды вызвать DLL, если первое предположение вашего ВП недостаточно велико.

  3. Передайте строку в узел функций библиотеки вызовов, используя параметр «String Handle», и используйте функции LabVIEW в вашей DLL для изменения размера строки по мере необходимости. Для этого требуется, чтобы ваша DLL была специально разработана для взаимодействия с LabVIEW, а также для связи со статической библиотекой, которая поставляется с LabVIEW.

    Пример этого метода поставляется с LabVIEW как examples/dll/hostname/hostname.vi.

2 голосов
/ 06 ноября 2008

Из вашего вопроса я предполагаю, что у вас уже есть 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 для строки.

...