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对象
- 打开PowerBuilder目标应用的Library画板
- 点击菜单
Component > Import COM Object - 在列表中找到
zkemkeeper类,导入后生成对应的自定义类(如n_zkem)
3. 设备连接初始化
- 网络连接:调用
Connect_Net(string sIP, int iPort),默认端口为4370 - 串口连接:调用
Connect_Com(int iComPort, int iBaudRate),参数匹配考勤机串口设置(常见波特率9600/115200) - 必须检查返回值,
True代表连接成功
4. 读取考勤日志
- 调用
ReadGeneralLogData(int iMachineNumber):准备读取设备日志,返回True才可开始循环读取 - 循环调用
GetGeneralLogData(...):每次调用获取一条日志,返回False时表示日志读取完毕 - 关键字段说明:
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
相关产品推荐
相关产品推荐

