首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

关于结构体数组的传递有关问题,DLL

2013-03-20 
关于结构体数组的传递问题,急。。。。,DLL本帖最后由 wangyounihao 于 2013-03-15 10:14:17 编辑C结构体原型//

关于结构体数组的传递问题,急。。。。,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]);
[解决办法]
自定义变量类型,函数原型,都是细节的地方要注意

热点排行