中控考勤二次开发中的下载考勤时照片
2015-09-10 11:49
381 查看
考勤机是m880,需要在考勤机中设置保存考勤时照片。
SDK的开发文档中只有下载考勤记录的函数
ReadGeneralLogData
SSR_GetGeneralLogData
两者配合能读取到打卡记录。
文档中没有下载考勤照片的函数,在代码提示中查看photo。发现以下三个函数
public virtual bool GetPhotoNamesByTime(int dwMachineNumber, int iFlag, string sTime, string eTime, out string AllPhotoName);
public virtual bool GetPhotoCount(int dwMachineNumber, out int count, int iFlag);
public virtual bool GetPhotoByName(int dwMachineNumber, string PhotoName, out byte PhotoData, out int PhotoLength);
根据名字可以猜到功能。
GetPhotoNamesByTime读取考勤机中的照片名列表,照片名命名规则是时间+考勤号,多个名字用'\t'分隔。
GetPhotoByName根据名字下载照片。
但是在代码中如下调用时,失败,返回错误码-2
找中控的售后,没人理。只能靠自己了。
用Wireshark分析电脑和考勤机的通讯,发现考勤机已经正确返回了照片的数据,照片数据是二进制数据。
GetPhotoByName函数的参数是out photoData,这个应该保存照片数据。
问题在于photoData是byte类型的,照片的二进制数据应该是byte[]类型。调用函数造成了向内存中非法写入数据。
想了个非常规的解决方法
最后在项目的属性里设置:允许不安全代码。
SDK的开发文档中只有下载考勤记录的函数
ReadGeneralLogData
SSR_GetGeneralLogData
两者配合能读取到打卡记录。
文档中没有下载考勤照片的函数,在代码提示中查看photo。发现以下三个函数
public virtual bool GetPhotoNamesByTime(int dwMachineNumber, int iFlag, string sTime, string eTime, out string AllPhotoName);
public virtual bool GetPhotoCount(int dwMachineNumber, out int count, int iFlag);
public virtual bool GetPhotoByName(int dwMachineNumber, string PhotoName, out byte PhotoData, out int PhotoLength);
根据名字可以猜到功能。
GetPhotoNamesByTime读取考勤机中的照片名列表,照片名命名规则是时间+考勤号,多个名字用'\t'分隔。
GetPhotoByName根据名字下载照片。
但是在代码中如下调用时,失败,返回错误码-2
byte photoData; int photolength = 0; //////照片名需要加上“.jpg” axCZKEM1.GetPhotoByName(iMachineNumber,"20150910063045" + ".jpg", out photoData, out photolength)
找中控的售后,没人理。只能靠自己了。
用Wireshark分析电脑和考勤机的通讯,发现考勤机已经正确返回了照片的数据,照片数据是二进制数据。
GetPhotoByName函数的参数是out photoData,这个应该保存照片数据。
问题在于photoData是byte类型的,照片的二进制数据应该是byte[]类型。调用函数造成了向内存中非法写入数据。
想了个非常规的解决方法
unsafe { byte[] photoData = new byte[1024 * 10]; int photolength = 0; try { if (axCZKEM1.GetPhotoByName(iMachineNumber, arr[j].Trim() + ".jpg", out photoData[0], out photolength)) { if (photolength < photoData.Length) { byte[] tmp = new byte[photolength]; Array.Copy(photoData, tmp, photolength); System.IO.File.WriteAllBytes( "d:\\photos\\20150910063045.jpg", tmp); } } } catch (Exception ex) { } }
最后在项目的属性里设置:允许不安全代码。
相关文章推荐
- sql 数据类型 建表时如何选择数据类型
- CSS中的!important属性用法
- go sample - format
- Mangos源码分析(1):服务器结构探讨之最简单的结构
- 面向对象的三大特性之多态
- HDU 5310 Souvenir
- c++拷贝构造函数的形参为什么必须是引用类型
- hdu 2077 汉诺塔IV 递推
- opencv常见错误
- R语言做文本挖掘 Part4文本分类
- hdu 2077 汉诺塔IV 递推
- Linux中cron命令的用法详解
- LIS
- POJ 1738:An old Stone Game 石子归并(GarsiaWachs算法)
- Android官方设计常用icon以及color颜色RGB值和对应颜色效果图
- 在mac系统安装Apache Tomcat的详细步骤
- 数据库 student sc course
- MyISAM 和 InnoDB 讲解
- iPad开发中得modal介绍
- popoverController使用注意