导航:
论坛 -> DELPHI技术
斑竹:liumazi,sephil
作者:
2019/7/22 13:52:45
标题:
c定义的结构体,Delphi怎么解析
浏览:1355
加入我的收藏
楼主:
打算用D调用个dll, int__stdcallOBUProg_Read_SysInfo(SysInfoType*struSystemInfo) 厂家给的c定义: #pragmapack(push,1)//结构体按1字节对齐! typedefstruct_TagSysInfoType { BYTEszProvider[8];//发行商代码 BYTEiType;//合同类型 BYTEiVersion;//合同版本 BYTEszSerialNumber[8];//发行序列号BCD码格式 BYTEszSignedDate[4];//启用日期 BYTEszExpiredDate[4];//到期日期 BYTEiStatus;//拆卸位 BYTEszReserved[58];//拆卸位保留字节 }SysInfoType; 请教大家怎么在D里定义,调用DLL,解析数据显示出来呢。急
----------------------------------------------
我很菜,但我很虚心!希望各位多多提携!
作者:
2019/7/22 14:35:42
1楼:
int main() { printf("%d\n",sizeof(SysInfoType)); return 0; } 自己跑去吧。。 发出来的代码 空格被破坏了。
----------------------------------------------
[alias] co = clone --recurse-submodules up = submodule update --init --recursiveupd = pullinfo = statusrest = reset --hard懒鬼提速https://www.cctry.com/ >http://qalculate.github.io/downloads.htmlhttps://www.cctry.com/
作者:
tiez (骑牛夜旅)
★☆☆☆☆
-
普通会员
2019/7/22 14:48:44
2楼:
C结构体对应delphi中的record,类型自己转一下。
----------------------------------------------
-
作者:
2019/7/22 14:54:13
2楼:
或者可以通过这个函数,读取dll的数据。请问怎么写成D,如何声明,使用函数,谢谢
此帖子包含附件: 大小: 67.1K
----------------------------------------------
我很菜,但我很虚心!希望各位多多提携!
作者:
2019/7/22 15:01:45
3楼:
我的这样的写的,但是读出来的是乱码。是不是定义得不对? function OBUProg_Get_ObuId(szOutObuSn: PAnsiChar; szOutMac: PAnsiChar; szOutEsamId: PAnsiChar): Integer; stdcall; function OBUProg_Get_ObuId; external 'gv_rsu_icc_api.dll' name 'OBUProg_Get_ObuId'; var i,gStat1:integer; szOutObuSn: array[1..8] of char; szOutMac: array[1..4] of char; szOutEsamId: array[1..4] of char; begin gStat1:=OBUProg_Get_ObuId(@szOutObuSn,@szOutMac,@szOutEsamId); if gStat1 = 0 then begin showmessage('读取数据成功!' edt1.Text:=szOutObuSn; end else begin showmessage('NO!'); showmessage(inttostr(gStat1)+'@'); end end;
----------------------------------------------
我很菜,但我很虚心!希望各位多多提携!
作者:
tiez (骑牛夜旅)
★☆☆☆☆
-
普通会员
2019/7/22 15:15:20
3楼:
TDah_NET_DEVICEINFO = Record SerialNumber: array [0..47] of Byte; //序列号 AlarmInPortNum: Byte; //DVR报警输入个数 AlarmOutPortNum: Byte; //DVR报警输出个数 DiskNum: Byte; //DVR 硬盘个数 DVRType: Byte; //DVR类型 case Integer of 0: (ChanNum: Byte); // DVR通道个数,登陆成功时有效 1: (LeftLogTimes: Byte);// 当登陆失败原因为密码错误时,通过此参数通知用户,剩余登陆次数,为0时表示此参数无效 end; typedef struct { BYTE sSerialNumber[DH_SERIALNO_LEN]; // 序列号 BYTE byAlarmInPortNum; // DVR报警输入个数 BYTE byAlarmOutPortNum; // DVR报警输出个数 BYTE byDiskNum; // DVR硬盘个数 BYTE byDVRType; // DVR类型,见枚举 NET_DEVICE_TYPE union { BYTE byChanNum; // DVR通道个数,登陆成功时有效 BYTE byLeftLogTimes; // 当登陆失败原因为密码错误时,通过此参数通知用户,剩余登陆次数,为0时表示此参数无效 }; } NET_DEVICEINFO, *LPNET_DEVICEINFO;
----------------------------------------------
-
作者:
tiez (骑牛夜旅)
★☆☆☆☆
-
普通会员
2019/7/22 15:19:30
4楼:
TDah_NET_Login = function(strDVRIP: PAnsiChar; wDVRPort: WORD; strUserName, strPassword: PAnsiChar; var netDeviceInfo: TDah_NET_DEVICEINFO; var error: TDahNet_Int): TDahNet_Handle; stdcall; 下划线部分就是用到我定义的那个结构的,而且也是引用传值 当然你再对结构体定义个指针这儿用指针做参数也是一样的。
----------------------------------------------
-
作者:
2019/7/22 15:52:26
5楼:
感谢大哥的回复。我现在就是头疼我3楼的代码是哪里不对吗?2楼是厂家的dll的函数的定义。 我现在就想用这个函数,得到三个参数的数据。
----------------------------------------------
我很菜,但我很虚心!希望各位多多提携!
作者:
2019/7/22 16:12:48
6楼:
现在时间紧,结构体不去琢磨了。 3楼的函数也能返回我要取的值。只是不知道是不 是我定义得不对还是怎么。无法取值。
----------------------------------------------
我很菜,但我很虚心!希望各位多多提携!
作者:
tiez (骑牛夜旅)
★☆☆☆☆
-
普通会员
2019/7/22 21:50:18
7楼:
首先你看下你临时变量明显是Char啊,现在delphi都是支持unicode的啊,你怎么也要对应用AnsiChar啊,教你一个经验,头文件中用Char*的你最好都用TBytes来对应,更方便,TBytes定义好了SetLength一下长度就可以了。传值时可直接@变量就可以了。 第二你数组取地址最好取首元素地址,就是@变量[0],当然你的习惯是从1开始那就@变量[1]。 如果还不行那我要了解一下返回值是不是0吗?如果是0那值是多少呢?他是16进制啊,怎么看出是不是乱码呢?如果是0返回值你认为不对那你可以把原来的字符数组初始化一下再调啊,看看是不是被改过了,如果改过了那就是对的啊。
----------------------------------------------
-
作者:
2019/7/22 23:51:14
8楼:
type _TagSysInfoType = packed record szProvider: array [0 .. 8 - 1] of AnsiChar; // 发行商代码 iVersion: BYTE; // 合同类型 szSerialNumber: array [0 .. 8 - 1] of AnsiChar; // 发行序列号BCD码格式 szSignedDate: array [0 .. 4 - 1] of AnsiChar; // 启用日期 szExpiredDate: array [0 .. 4 - 1] of AnsiChar; // 到期日期 iStatus: BYTE; // 拆卸位 szReserved: array [0 .. 58 - 1] of AnsiChar; // 拆卸位保留字节 end; SysInfoType = _TagSysInfoType; PSysInfoType = ^SysInfoType; //int__stdcall OBUProg_Read_SysInfo(SysInfoType*struSystemInfo) function OBUProg_Read_SysInfo(var struSystemInfo :SysInfoType ):Integer;stdcall; 并且你写的代码如果在Delphi2007或以下版本是没问题的,高版本Delphi的Char和CPP的Char不一样。 高版本Delphi的Char相当于CPP的WideChar,ANSIChar才相当于CPP的Char。 function OBUProg_Get_ObuId(szOutObuSn: PAnsiChar; szOutMac: PAnsiChar; szOutEsamId: PAnsiChar): Integer; stdcall; external 'gv_rsu_icc_api.dll' name 'OBUProg_Get_ObuId'; ////// var i,gStat1:integer; szOutObuSn: array[1..8] of Ansichar; szOutMac: array[1..4] of Ansichar; szOutEsamId: array[1..4] of Ansichar; begin gStat1:=OBUProg_Get_ObuId(@szOutObuSn,@szOutMac,@szOutEsamId); if gStat1 = 0 then begin showmessage('读取数据成功!'); end else begin showmessage('NO!'); end; end;
----------------------------------------------
武稀松http://www.raysoftware.cn