代码之家  ›  专栏  ›  技术社区  ›  alex77

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

  •  4
  • alex77  · 技术社区  · 17 年前

    2 回复  |  直到 17 年前
        1
  •  3
  •   Community Mohan Dere    6 年前

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

    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 .

        2
  •  2
  •   Azim J    17 年前

    从您的问题中,我假设您已经有了一个可以将数字返回到Labview的DLL。为了从DLL返回字符串,我创建了一个具有以下C++功能的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);
    

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

    CStr returnString()
    { ...
     }
    

    但是我在编译DLL项目时遇到了构建错误。

    使现代化

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