关于结构体数组的传递问题,急。。。。,DLL
本帖最后由 wangyounihao 于 2013-03-15 10:14:17 编辑 C结构体原型// Measured value output (single)
EXP RC WINAPI LKIF2_GetCalcDataSingle(IN int OutNo,OUT LKIF_FLOATVALUE_OUT * CalcData);
// Measured value output (multiple)
EXP RC WINAPI LKIF2_GetCalcDataMulti(IN LKIF_OUTNO OutNo, OUT LKIF_FLOATVALUE_OUT * CalcData);
// Specify OUT
typedef enum {
LKIF_OUTNO_01 = 0x0001,// OUT01
LKIF_OUTNO_02 = 0x0002,// OUT02
LKIF_OUTNO_03 = 0x0004,// OUT03
LKIF_OUTNO_04 = 0x0008,// OUT04
LKIF_OUTNO_05 = 0x0010,// OUT05
LKIF_OUTNO_06 = 0x0020,// OUT06
LKIF_OUTNO_07 = 0x0040,// OUT07
LKIF_OUTNO_08 = 0x0080,// OUT08
LKIF_OUTNO_09 = 0x0100,// OUT09
LKIF_OUTNO_10 = 0x0200,// OUT10
LKIF_OUTNO_11 = 0x0400,// OUT11
LKIF_OUTNO_12 = 0x0800,// OUT12
LKIF_OUTNO_ALL = 0x0FFF,// All OUTs
} LKIF_OUTNO;
// Measurement value
typedef struct {
intOutNo;// OUT No(0-11)
LKIF_FLOATRESULTFloatResult;// valid or invalid data
floatValue;// Measurement value
} LKIF_FLOATVALUE_OUT;
typedef struct {
LKIF_FLOATRESULTFloatResult;// valid or invalid data
floatValue;// Measurement value
} LKIF_FLOATVALUE;
VB结构体原型' Measurement control commands
'
'Measured value output (single)
Public Declare Function LKIF2_GetCalcDataSingle Lib "LLLL2.dll" (ByVal outNo As Long, ByRef calcData As LKIF_FLOATVALUE_OUT) As RC
'Measured value output (multiple)
Public Declare Function LKIF2_GetCalcDataMulti Lib "LLLL2.dll" (ByVal outNo As LKIF_OUTNO, ByRef calcData As LKIF_FLOATVALUE_OUT) As RC
Public Enum LKIF_OUTNO
LKIF_OUTNO_01 = &H1 ' OUT01
LKIF_OUTNO_02 = &H2 ' OUT02
LKIF_OUTNO_03 = &H4 ' OUT03
LKIF_OUTNO_04 = &H8 ' OUT04
LKIF_OUTNO_05 = &H10 ' OUT05
LKIF_OUTNO_06 = &H20 ' OUT06
LKIF_OUTNO_07 = &H40 ' OUT07
LKIF_OUTNO_08 = &H80 ' OUT08
LKIF_OUTNO_09 = &H100 ' OUT09
LKIF_OUTNO_10 = &H200 ' OUT10
LKIF_OUTNO_11 = &H400 ' OUT11
LKIF_OUTNO_12 = &H800 ' OUT12
LKIF_OUTNO_ALL = &HFFF ' All OUTs
End Enum
' Measurement value
Public Type LKIF_FLOATVALUE_OUT
outNo As Long ' OUT No(0-11)
FloatResult As LKIF_FLOATRESULT ' valid or invalid data
value As Single ' Measurement value
End Type
Public Type LKIF_FLOATVALUE
FloatResult As LKIF_FLOATRESULT ' valid or invalid data
value As Single ' Measurement value
End Type
修改后的delphi7 的结构体
Function LKIF2_GetCalcDataSingle(outNo:integer;var vcalcData:LKIF_FLOATVALUE_OUT):RC;stdcall;external 'LLLL2.dll';
//'Measured value output (multiple)
Function LKIF2_GetCalcDataMulti( outNo:LKIF_OUTNO; var calcData:LKIF_FLOATVALUE_OUT):RC;stdcall;external 'LLLL2.dll';
//' Specify OUT
type LKIF_OUTNO=
(
LKIF_OUTNO_01 = $1, //' OUT01
LKIF_OUTNO_02 = $2, //' OUT02
LKIF_OUTNO_03 = $4, //' OUT03
LKIF_OUTNO_04 = $8, //' OUT04
LKIF_OUTNO_05 = $10, //' OUT05
LKIF_OUTNO_06 = $20, //' OUT06
LKIF_OUTNO_07 = $40, //' OUT07
LKIF_OUTNO_08 = $80, //' OUT08
LKIF_OUTNO_09 = $100, //' OUT09
LKIF_OUTNO_10 = $200, //' OUT10
LKIF_OUTNO_11 = $400, //' OUT11
LKIF_OUTNO_12 = $800, //' OUT12
LKIF_OUTNO_ALL = $FFF //' All OUTs
);
Type LKIF_FLOATVALUE_OUT=record
outNo:integer; //' OUT No(0-11)
FloatResult:LKIF_FLOATRESULT; //' valid or invalid data
value:single; //' Measurement value
end;
Type LKIF_FLOATVALUE=record
FloatResult:LKIF_FLOATRESULT; //' valid or invalid data
value:single; //' Measurement value
End;
delphi 调用如下,
//第一个函数调用无错误procedure TFrmMain.GetCalcDataSingle;
var
outNo:LKIF_OUTNO;
cnt:integer;
result:RC;
calcData:LKIF_FLOATVALUE_OUT;
begin
result:=LKIF2_GetCalcDataSingle(0,calcData);
If result=RC_OK Then
begin
Label1.caption:=FloatResultValueOutToText(calcData);
end;
result:=LKIF2_GetCalcDataSingle(1,calcData);
If result=RC_OK Then
begin
Label2.caption:=FloatResultValueOutToText(calcData);
end;
end;
第二个函数调用错误 ,type of actual and format var parameters must be identical(形参与实参必须一致
)
如下:
procedure TFrmMain.GetCalcDataMulti;
var
outNo:LKIF_OUTNO;
cnt:integer;
result:RC;
calcData:array[0..MAX_OUT-1] of LKIF_FLOATVALUE_OUT;
begin
outNo:=LKIF_OUTNO_02;
result:=LKIF2_GetCalcDataMulti(outNo,calcData^[0]); //出错
If result=RC_OK Then
begin
// Label1.caption:=FloatResultValueOutToText(calcData);
end;
end;
请各位看看谢谢
[解决办法]
试下这样result:=LKIF2_GetCalcDataMulti(outNo,calcData[0]);
[解决办法]
自定义变量类型,函数原型,都是细节的地方要注意