4

我想使用LabVIEW的调用库函数节点来访问一个DLL函数,并让这个函数返回一个字符串以显示在我的VI上。我该怎么做呢?我很高兴从我的 DLL 中返回数字,但我真的很难找到任何关于如何返回字符串的示例。

4

2 回答 2

3

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

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

    看起来examples/dll/regexpr/Regular Expression Solution/VIs/Get Error String.vi在LabVIEW目录中采用了这种方法。

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

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

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

    此方法的一个示例随 LabVIEW 一起提供examples/dll/hostname/hostname.vi

于 2008-11-07T05:30:49.383 回答
2

我从您的问题中假设您已经有一个可以将数字返回给 Labview 的 DLL。为了从 DLL 返回一个字符串,我创建了一个带有以下 C++ 函数的 DLL

void returnString(char myString[])
{
  const char *aString = "test string";
  memcpy(myString, aString, 12);
}

然后在 Labview 中,我使用调用库函数节点并将其配置如下

    库名称或路径:c:\path\to\my\custom.dll
           函数名称:返回字符串
           调用约定:C

    参数:
           参数:返回类型
                类型:无效

           参数:arg1
                类型:字符串
                字符串格式:C 字符串指针

    函数原型:
        无效返回字符串(CStr arg1);

将框图中的 arg1 输出连接到字符串指示器并运行。字符串“test string”应该出现在前面板上。

我试图让 returnString 函数的类型为 CStr ,如

CStr returnString()
{ ...
 }

但是在编译 DLL 项目时出现构建错误。

更新

感谢@bk1e 评论,不要忘记在 Labview 中为字符串预分配空间。

于 2008-11-06T17:50:34.053 回答