调用dll文件时如何处理struct结构的返回值?
时间:12-13
整理:3721RD
点击:
在LabVIEW7中,调用dll文件时如何处理struct结构的返回值?
我使用LABVIEW调用一块通讯卡的dll文件,需处理其中的读数据函数VCI_Receive,
其在VB中的函数声明为:
Declare Function VCI_Receive Lib "ControlCAN.dll" (ByVal DeviceType
As Long, ByVal DeviceInd As Long, ByVal CANInd As Long, ByRef Receive
As VCI_CAN_OBJ, ByVal length As Long, ByVal WaitTime As Long) As Long
其在VC中的定义为:
ULONG __stdcall VCI_Receive(DWORD DeviceType,DWORD DeviceInd,DWORD
CANInd,PVCI_CAN_OBJ pReceive,ULONG Len,INT WaitTime=-1);
其中VCI_CAN_OBJ的定义为:
typedef struct _VCI_CAN_OBJ{
UINT ID;
UINT TimeStamp;
BYTE TimeFlag;
BYTE SendType;
BYTE RemoteFlag;//是否是远程帧
BYTE ExternFlag;//是否是扩展帧
BYTE DataLen;
BYTE Data[8];
BYTE Reserved[3];
}VCI_CAN_OBJ,*PVCI_CAN_OBJ;
在LABVIEW中只能采用cluster的形式传递struct结构的参数,我按照上述结构,
另外参照labview提供的例子程序,构造相应的cluster,向dll node中传递参数。
VCI_Receive函数中的VCI_CAN_OBJ结构参数,为一指针类型,用来在此
地址保存采集得到的信息。为此,我在dll node中,在该参数的输入侧(左侧)
构造了一个符合VCI_CAN_OBJ结构的cluster,其ID为0,Data为零数组。希望根据
这个cluster的地址,在该参数的输出侧(右侧)得到真正应该读到的数值。
现在遇到的奇怪问题是:
除了在第一次读的过程中,读到了真正的data,在后面所有的读命令中,读到的数据
(.data)都和左侧输入端的数据相同。但ID则每次都可受到(即为实际数据中的ID)。
我在这个过程百思不得其解的是:
如果我使用了错误的数据结构来构造输入侧的cluster,那么就不应该收到任何正确数据。
如果我使用的是正确结构的cluster,那么就应该收到完全正确的数据,而不是有的对,
有的错。这个问题出在哪里?
请大家指点,谢谢
.19
我使用LABVIEW调用一块通讯卡的dll文件,需处理其中的读数据函数VCI_Receive,
其在VB中的函数声明为:
Declare Function VCI_Receive Lib "ControlCAN.dll" (ByVal DeviceType
As Long, ByVal DeviceInd As Long, ByVal CANInd As Long, ByRef Receive
As VCI_CAN_OBJ, ByVal length As Long, ByVal WaitTime As Long) As Long
其在VC中的定义为:
ULONG __stdcall VCI_Receive(DWORD DeviceType,DWORD DeviceInd,DWORD
CANInd,PVCI_CAN_OBJ pReceive,ULONG Len,INT WaitTime=-1);
其中VCI_CAN_OBJ的定义为:
typedef struct _VCI_CAN_OBJ{
UINT ID;
UINT TimeStamp;
BYTE TimeFlag;
BYTE SendType;
BYTE RemoteFlag;//是否是远程帧
BYTE ExternFlag;//是否是扩展帧
BYTE DataLen;
BYTE Data[8];
BYTE Reserved[3];
}VCI_CAN_OBJ,*PVCI_CAN_OBJ;
在LABVIEW中只能采用cluster的形式传递struct结构的参数,我按照上述结构,
另外参照labview提供的例子程序,构造相应的cluster,向dll node中传递参数。
VCI_Receive函数中的VCI_CAN_OBJ结构参数,为一指针类型,用来在此
地址保存采集得到的信息。为此,我在dll node中,在该参数的输入侧(左侧)
构造了一个符合VCI_CAN_OBJ结构的cluster,其ID为0,Data为零数组。希望根据
这个cluster的地址,在该参数的输出侧(右侧)得到真正应该读到的数值。
现在遇到的奇怪问题是:
除了在第一次读的过程中,读到了真正的data,在后面所有的读命令中,读到的数据
(.data)都和左侧输入端的数据相同。但ID则每次都可受到(即为实际数据中的ID)。
我在这个过程百思不得其解的是:
如果我使用了错误的数据结构来构造输入侧的cluster,那么就不应该收到任何正确数据。
如果我使用的是正确结构的cluster,那么就应该收到完全正确的数据,而不是有的对,
有的错。这个问题出在哪里?
请大家指点,谢谢
.19
调用方式没看出什么问题.
你在程序里面每个循环都send一次,延时200ms,然后读一次.中间没有改过send的数据.那么
读取的数据本来也不该变吧.
但是你调用read的时候没有初始化数组(bundle之前),这个是不应该的.没crash就便宜你了
. 修改了可能memory错误就没有了. 记住任何时候使用数组都要初始化!
.70
谢谢femto,
不过我试过初始化数组(定为0数组或其他),出现的问题仍然是
只能读到第一次的数据和后面的ID,问题出在哪里呢?呵呵
谢谢你的指点
.170
我不知道.要不你拿其他语言试试看干不干活.先确认设备没问题.
实在不行就拿其他语言写个dll封装他好了.不用struct.
.70
看来要逼我用杀手锏了,hengheng
谢谢femto,呵呵
.190