DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: sprblck
今日帖子: 13
在线用户: 22
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 happytimes (小帮) ★☆☆☆☆ -
盒子活跃会员
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,解析数据显示出来呢。急

----------------------------------------------
我很菜,但我很虚心!希望各位多多提携!
作者:
男 keymark (嬲) ▲▲▲△△ -
普通会员
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,类型自己转一下。
----------------------------------------------
-
作者:
男 happytimes (小帮) ★☆☆☆☆ -
盒子活跃会员
2019/7/22 14:54:13
2楼: 或者可以通过这个函数,读取dll的数据。请问怎么写成D,如何声明,使用函数,谢谢
此帖子包含附件:
JPEG 图像
大小:67.1K
----------------------------------------------
我很菜,但我很虚心!希望各位多多提携!
作者:
男 happytimes (小帮) ★☆☆☆☆ -
盒子活跃会员
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;
下划线部分就是用到我定义的那个结构的,而且也是引用传值
当然你再对结构体定义个指针这儿用指针做参数也是一样的。
----------------------------------------------
-
作者:
男 happytimes (小帮) ★☆☆☆☆ -
盒子活跃会员
2019/7/22 15:52:26
5楼: 感谢大哥的回复。我现在就是头疼我3楼的代码是哪里不对吗?2楼是厂家的dll的函数的定义。

我现在就想用这个函数,得到三个参数的数据。
----------------------------------------------
我很菜,但我很虚心!希望各位多多提携!
作者:
男 happytimes (小帮) ★☆☆☆☆ -
盒子活跃会员
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返回值你认为不对那你可以把原来的字符数组初始化一下再调啊,看看是不是被改过了,如果改过了那就是对的啊。
----------------------------------------------
-
作者:
男 wr960204 (武稀松) ★☆☆☆☆ -
盒子活跃会员
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
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行82.03125毫秒 RSS