String 如何使用调用库函数节点将字符串传递回labview

String 如何使用调用库函数节点将字符串传递回labview,string,dll,labview,String,Dll,Labview,我想使用LabVIEW的调用库函数节点来访问DLL函数,并让该函数返回一个字符串以显示在我的VI上。我将如何执行此操作?我很高兴从我的DLL返回数字,但我真的很难找到任何如何返回字符串的示例。从您的问题中,我假设您已经有了一个可以将数字返回到Labview的DLL。为了从DLL返回字符串,我创建了一个具有以下C++函数< /p>的DLL void returnString(char myString[]) { const char *aString = "test string"; me

我想使用LabVIEW的调用库函数节点来访问DLL函数,并让该函数返回一个字符串以显示在我的VI上。我将如何执行此操作?我很高兴从我的DLL返回数字,但我真的很难找到任何如何返回字符串的示例。

从您的问题中,我假设您已经有了一个可以将数字返回到Labview的DLL。为了从DLL返回字符串,我创建了一个具有以下C++函数< /p>的DLL
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); 但是我在编译DLL项目时遇到了构建错误

更新
感谢@bk1e comment,别忘了在Labview中为字符串预先分配空间。

至少有几种方法可以从调用库函数节点返回字符串:

  • 从DLL函数返回C字符串指针,并将调用库函数节点配置为“C字符串指针”的返回类型。请注意,返回的字符串必须在函数返回后有效,因此它不能是指向堆栈上分配的字符串的指针。它必须是以下内容之一:在堆上分配、静态分配、常量字符串文本等

    LabVIEW目录中的
    examples/dll/regexpr/Regular Expression Solution/VIs/Get Error String.vi
    采用这种方法

  • 在VI中分配一个字符串,使用Azim建议的“C字符串指针”参数将其传递给调用库函数节点,并在DLL中覆盖其内容。分配字符串的一种方法是使用Initialize Array创建所需大小的u8数组,然后使用Byte Array to string将其转换为字符串

    确保传入的字符串足够大,可以容纳字符串的内容,并确保将字符串长度传递给DLL,以便它知道缓冲区有多大。我认为默认参数是一个空字符串。如果VI的第一个猜测不够大,那么计算正确的字符串长度可能需要调用DLL两次

  • 使用“字符串句柄”参数将字符串传递给调用库函数节点,并根据需要使用DLL中的LabVIEW函数调整字符串大小。这要求您的DLL专门设计为与LabVIEW接口,并且需要针对LabVIEW提供的静态库进行链接

    此方法的一个示例随LabVIEW附带为
    examples/dll/hostname/hostname.vi


  • 使用“C字符串指针”字符串格式时,LabVIEW代码负责预分配足够大的字符串以传递给调用库函数节点,否则DLL可能会损坏LabVIEW堆。分配字符串的一种方法是将Initialize Array和Byte Array组合为字符串。使用第二种方法与许多Windows API函数的工作方式类似-第一次调用缓冲区大小为0以查询字符串长度,第二次调用缓冲区大小为适当。这样DLL就不会绑定到LabVIEW,但也可以从其他编程环境中使用。
    CStr returnString()
    { ...
     }