【问题标题】:LabVIEW call DLL with struct return带有结构返回的LabVIEW调用DLL
【发布时间】:2021-12-28 19:49:17
【问题描述】:

我正在用 C 创建一个 DLL,并尝试调用函数来获取结构返回值。

如果我对函数返回使用标准变量(int、float、char、char*)效果很好。

我的结构:

typedef struct
{
  int  success;   /** Success to call a function **/
  char returned[32];  /** Return of the called function **/
} DLL_RETURN_t;

功能:

DLL_RETURN_t* getData() {
    DLL_RETURN_t* test;
    test->success = 1;
    strcpy((char*)test->returned, "Simple Test");
    return test;
}

我使用导入共享库 LabVIEW 工具来导入 DLL 并创建 VI。

创建的 VI 有一个整数输出,但我希望是一个簇或一个指针。

【问题讨论】:

标签: struct dll labview


【解决方案1】:

这是来自配置返回类型的帮助:

调用 DLL 中的函数不能返回指针,因为 LabVIEW 中没有指针类型。但是,您可以将返回类型指定为与指针大小相同的整数。然后LabVIEW将地址视为一个简单的整数,您可以将其传递给以后的DLL调用

你应该可以使用指针来获取 LV 中的数据,但这已经更复杂了,我实际上不记得那些细节,所以你必须查找它或等待其他人填写它在。

人们通常做的是将指向结构的指针传递给函数(在您的情况下,它已经存在 - getData() 的第一个参数),然后在 LV 中您可以配置该参数要适应类型和按值处理。将一个与结构匹配的集群传递给它,当节点返回时,您将在并行终端中获得该值。我假设向导已经在你的情况下这样做了。

【讨论】:

    【解决方案2】:

    首先,您的代码中有一个错误:指针 test 已声明但从未初始化/分配给,因此取消引用是“读取未初始化的变量”,因此是未定义的行为。但我想这只是由于在 SO 上发布的简化示例。

    所以假设你在test 中有一个有效的指针,并且它的生命周期超出了getData() 的执行范围,你的问题归结为

    如何解码我有一个指针指向的结构?

    答案是使用LabVIEW Manager Functions 的函数moveBlock。

    如果您不确定如何使用 moveBlock 函数,请发表评论,我将对此进行详细说明。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-11
      • 2014-11-13
      相关资源
      最近更新 更多