You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerBuilder调用zkemkeeper.dll获取考勤机日志报错求助

PowerBuilder中使用zkemkeeper.dll提取考勤日志及GetGeneralLogData调用错误解决

GetGeneralLogData调用错误的核心原因及解决

你遇到的Error calling external object function getgenerallogdata错误,绝大多数是参数数据类型不匹配导致的。zkemkeeper.dll的GetGeneralLogData接口中,所有输出参数的类型都是long*(对应PowerBuilder的long类型),但你代码里用了int类型,类型不兼容会触发外部函数调用失败。

修正后的代码

// 修正变量类型为long,匹配zkemkeeper的参数要求
long dwTMachine, dwEnrollNumber,dwEMachineNumber,dwVerifyMode
long dwInOutMode,dwYear,dwMonth,dwDay,dwHour,dwMinute
long i, ll_index
i=1

// 必须先成功连接设备才能读取日志
if main.ZKEM.object.Connect_Net("考勤机IP", 4370) then // 串口设备改用Connect_Com(com口,波特率)
    if main.ZKEM.object.ReadGeneralLogData(machineNum) then
        do while main.ZKEM.object.GetGeneralLogData(MachineNum, ref dwTMachine, ref dwEnrollNumber, ref dwEMachineNumber, ref dwVerifyMode, ref dwInOutMode, ref dwYear, ref dwMonth, ref dwDay, ref dwHour, ref dwMinute)
            listviewitem l_lvi
            ll_index = lv_log.AddItem(l_lvi)
            lv_log.SetItem(ll_index, 1, string(i))
            lv_log.SetItem(ll_index, 2, string(dwEnrollNumber))
            lv_log.SetItem(ll_index, 4, string(dwVerifyMode))
            lv_log.SetItem(ll_index, 5, string(MachineNum))
            lv_log.SetItem(ll_index, 6, string(dwInOutMode))
            // 补充考勤时间列(可选)
            lv_log.SetItem(ll_index, 3, string(dwYear) + "-" + string(dwMonth) + "-" + string(dwDay) + " " + string(dwHour) + ":" + string(dwMinute))
            
            i=i+1
        loop 
    else
        messagebox("提示", "读取日志准备失败,设备可能无日志或连接异常")
    end if
    // 操作完成后断开连接
    main.ZKEM.object.Disconnect()
else
    messagebox("错误", "无法连接考勤机,请检查IP/串口参数")
end if

PowerBuilder使用zkemkeeper.dll提取考勤日志完整操作指导

1. 注册zkemkeeper.dll

  • 32位系统:将zkemkeeper.dll复制到C:\Windows\System32,管理员权限打开命令提示符执行:regsvr32 C:\Windows\System32\zkemkeeper.dll
  • 64位系统:将zkemkeeper.dll复制到C:\Windows\SysWOW64,管理员权限打开32位命令提示符(C:\Windows\SysWOW64\cmd.exe)执行:regsvr32 C:\Windows\SysWOW64\zkemkeeper.dll

2. PowerBuilder中导入COM对象

  1. 打开PowerBuilder目标应用的Library画板
  2. 点击菜单Component > Import COM Object
  3. 在列表中找到zkemkeeper类,导入后生成对应的自定义类(如n_zkem)

3. 设备连接初始化

  • 网络连接:调用Connect_Net(string sIP, int iPort),默认端口为4370
  • 串口连接:调用Connect_Com(int iComPort, int iBaudRate),参数匹配考勤机串口设置(常见波特率9600/115200)
  • 必须检查返回值,True代表连接成功

4. 读取考勤日志

  1. 调用ReadGeneralLogData(int iMachineNumber):准备读取设备日志,返回True才可开始循环读取
  2. 循环调用GetGeneralLogData(...):每次调用获取一条日志,返回False时表示日志读取完毕
  3. 关键字段说明:
    • dwEnrollNumber:员工工号
    • dwVerifyMode:验证方式(1=指纹,2=密码,3=卡等,以zkemkeeper文档为准)
    • dwInOutMode:进出模式(1=上班,2=下班等,匹配设备设置)
    • dwYear/dwMonth/dwDay/dwHour/dwMinute:考勤时间

5. 清理操作

日志读取完成后,必须调用Disconnect()断开设备连接,释放资源

其他排查点

  • 确认考勤机在线,IP/串口参数正确
  • 确保PowerBuilder程序位数(32/64位)与zkemkeeper.dll位数一致
  • 检查考勤机是否保留未读取的日志(部分设备读取后会标记日志为已读,需在设备端设置保留)

内容的提问来源于stack exchange,提问作者Laravel10

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 23:35:18