LabVIEW调用DLL传递结构体参数

LabVIEW 中调用动态库接口时,如果是值传递的结构体,可以根据字段拆解为多个参数;如果参数为结构体指针,可用簇(Cluster)来匹配,其内存连续相当于单字节对齐。

1.值传递

接口定义:

typedef struct {
	int a;
	int b;
} DataA;

void testData1(DataA data, int* a, int* b) {
	*a = data.a;
	*b = data.b;
}

LabVIEW 函数原型:

LabVIEW 程序框图:

2.指针传递

指针参数可作为输入和输出。接口定义:

typedef struct {
	int a;
	int b;
} DataA;

void testData2(DataA *data, int* a, int* b) {
	*a = data->a;
	*b = data->b;
	data->a = *b;
	data->b = *a;
}

LabVIEW 函数原型:

LabVIEW 程序框图:

3.字节对齐问题 

LabVIEW 中簇是内存连续的,相当于单字节对齐,如果动态库的结构体不是单字节对齐那就要在簇中补齐。接口定义:

#pragma pack(4)
typedef struct {
	int a;
	char b;
	int c;
} DataB;
#pragma pack()

void testData3(DataB* data, int* a, char* b , int *c) {
	*a = data->a;
	*b = data->b;
	*c = data->c;
}

LabVIEW 函数原型:

未补齐数值有问题: 

字节补齐后结果正常:

4.复杂结构体

以包含字节数组和嵌套结构体为例,数组和结构体成员都可以当作内部组合了另一个簇。接口定义:

typedef struct {
	int c;
	int d;
} DataSub;

typedef struct {
	int a;
	char b[20];
	DataSub sub;
} DataC;

void testData4(DataC* data) {
	data->a = 123;
	char arr[] = "COVID-19";
	memcpy(data->b, arr, sizeof(arr));
	data->sub.c = 2019;
	data->sub.d = 2022;
}

LabVIEW 函数原型:

LabVIEW 程序框图: 

运行结果:

要注意的就是【数组至簇转换】(Array to Cluster)要自己指定大小(右键菜单),默认 9,最大 256 个元素。

5.用字节数组传递结构体

对于大于 256 个元素的数组,没找到比较简单的转换成簇的方式(LabVIEW 有点反直觉的地方就是数组连到簇里会当作指针),索性我直接把接口按字节数组传递。LabVIEW 用的大端,PC 上一般小端,所以字节和数值转换要翻转一下。接口定义:

typedef struct {
	int len;
	char arr[1000];
} DataD;

void testData5(DataD* data) {
	char info[] = "Hello world!";
	data->len = sizeof(info);
	memcpy(data->arr, info, data->len);
}

LabVIEW 函数原型:

LabVIEW 程序框图:

运行结果:

6.结构体数组

结构体数组无非就是把簇作为数组元素,不过要注意结构体的字节对齐,dll 中最好 1 字节对齐,这样 LabVIEW 就不用补齐了。接口定义:

#pragma pack(1)
typedef struct {
	int num;
	char index;
} MyData;
#pragma pack()

void loadData(MyData* data) {
	std::vector<MyData> arr{
		MyData{7, 0},
		MyData{11, 1},
		MyData{13, 2},
		MyData{17, 3}
	};
	memcpy((void*)data, (void*)arr.data(), sizeof(MyData) * arr.size());
}

LabVIEW 函数原型:

LabVIEW 程序框图: 

运行结果:

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龚建波

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值