关于labview传入参数到DLL结构体

有人问为什么往DLL的结构体传入簇不行?这里面涉及到内存对齐知识

在C中结构体对齐原则如下:

1.结构体变量的起始地址能够被其最宽的成员大小整除

2.结构体每个成员相对于起始地址的偏移能够被其自身大小整除,如果不能则在前一个成员后面补充字节

3.结构体总体大小能够被最宽的成员的大小整除,如不能则在后面补充字节

C/C++程序内存对齐跟编译器有关,一般是8或者4字节对齐,也可以自行设定

然而labview中簇内存是连续的,也就是单字节对齐

labview传入的参数要跟DLL的结构体参数对齐,这样才能正确调用

定义一个简单的结构体:

加入预编译命令#pragma pack(1),打印结构体的信息如下:

加入预编译命令#pragma pack(8),打印结构体的信息如下:

为什么多了四个字节?请参考上面的对齐原则,在int后面补充了4个字节

下面以labview代码测试:

void test(char* msg, student *stuinfo);//DLL函数

功能:传入结构体,返回学生信息

首先按照一般方式去操作,如下图:

无法返回正确的结果,原因是内存没有对齐

更改labview代码,测试DLL中预设单字节对齐方式:

可以正确的传入参数,并且返回结果

测试DLL中预设8字节对齐方式:

可以正确的传入参数,并且返回结果

如果结构体只包含int,double,bool这些类型就更容易处理了,这就不讲了

结论:labview给DLL中结构体传入参数,要保证字节对齐

下面是注意事项,很关键:

  1. labview中层次结构数据类型(例如,簇)中的数组和字符串始终包括大小信息。

    所以簇内存中包含字符串的大小,要把这个去掉,如果不包含字符串就不用处理

  2. 结构体的字节对齐对于跨语言不同编译器传参时尤为重要

  3. 注意大小端

(0)

相关推荐