中控考勤二次开发中的下载考勤时照片

考勤机是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

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) { }
 }

最后在项目的属性里设置:允许不安全代码。

时间: 2024-11-01 13:04:32

中控考勤二次开发中的下载考勤时照片的相关文章

CAD二次开发中浮动面板不浮动的问题

CAD二次开发中创建了一个浮动面板,想让它创建出来后以浮动状态显示, 但是DockSides.None设置完后,面板还是不浮动.搞了很久,最后原来是 需要先设置Visible,再设置DockSides,这样就好了. ps = new PaletteSet("PSCollectPart"); ps.Style = PaletteSetStyles.NameEditable | PaletteSetStyles.ShowPropertiesMenu | PaletteSetStyles.S

中控考勤机二次开发小记

最近公司更换了一批考勤机,但是居然无法上传和下载指纹等数据.我们的系统用的是广东一家人力资源系统,问了一下,说他们的系统不支持最新中控更新了固件的考勤机.我KAO了他NN个熊,不支持居然?特别是还要收好几千大洋的费用,问题我们还交着服务费呢?要不就在他们哪买卡机,免费给我们升级,哪还是一样吗?他们卖的考勤机可不是市场上的价格,是贵 一半的价格. 好吧, 其实要钱也不是要我给,但公司也不愿意给啊,这样的申请过不去啊.人事部也在闹,扯来扯去的.我用中控几年前发布的ZKTIME5.0这款自带的软件操作

AE二次开发中几个功能速成归纳(符号设计器、创建要素、图形编辑、属性表编辑、缓冲区分析)

/* * 实习课上讲进阶功能所用文档,因为赶时间从网上抄抄改改,凑合能用,记录一下以备个人后用. * * ------------------------------------------------------------------- * * 使用前提:已搭建好AE的GIS基本框架,包括TOC.mapcontrol.toolbar拖控件,mxd.shp文件载入显示,查看图层属性表等 * * --------------------------------------------------

(我是初学者)第一次项目开发(二)开发中遇到的问题和注意事项

这周正式开始做项目练习,这才发现实际去做的时候会遇到和出现很多的问题 在这里说一说我的体会,请指正 首先,实体类 1.实体类中有哪些属性,类型是什么,并根据属性建立sql的相应表格, 2.哪些属性需要在写在实体类中,而在sql中不用添加 3.值得注意的是变量名要规范,一看就知道什么意思,同时在建sql表的时候,要尽力保证sql中的变量名和实体bean中的变量名一致,这在后面写实现类的时候会方便很多,这个也是在写持久接口实现类的才发现的 二.sql数据的添加 这一步是和业务接口设计分工同时进行的,

javaweb学习总结二十二(servlet开发中常见的问题汇总)

一:web应用的映射问题 通常我们从别人那里拷贝来的代码,自己会修改应用的名称,但是web映射的访问路径并没有修改,还是原来的映射. 解决方法: 工程右键--properties--myeclipse--web,修改webroot即可 二:web.xml配置文件 web.xml中的配置文件信息如下: 三:同一个servlet类可以映射到多个url地址上  

AM二次开发中选择指定范围内的对象

使用Spatial可以快速选择指定范围内的对象 例如下面的代码可以选择所有在[0,0,0]-[10m,10m,10m]这个盒子之内的对象: 其中ElementsInBox还可以指定对象类型做进一步筛选. LimitsBox box = LimitsBox.Create(Position.Create(0, 0, 0), Position.Create(10000.0f, 10000.0f, 10000.0f)); DbElement[] eles = Spatial.Instance.Eleme

cad二次开发中DBText对象的外框GeometricExtents有问题?

CAD2007版本 acDoc.Editor.WriteMessage( string.Format("[{0:F1},{1:F1},{2:F1}] - [{3:F1},{4:F1},{5:F1}]\n", acText.GeometricExtents.MinPoint.X, acText.GeometricExtents.MinPoint.Y, acText.GeometricExtents.MinPoint.Z, acText.GeometricExtents.MaxPoint.

ios 开发中 --做登陆注册时编译出现的错误和解决方法

这种问题,通常出现在添加第三方库文件或者多人开发时. 这种问题一般是找不到文件而导致的链接错误. 我们可以从如下几个方面着手排查. 1.以如下错误为例,如果是多人开发,你同步完成后发现出现如下的错误. 这个是使用CocoaPods下载的BmobSDK 实现注册时出现的错 解决方法:(图示) Undefined symbols for architecture armv7: "_OBJC_CLASS_$_MyPageLogViewController", referenced from:

Android开发中与服务器交互时,遇到java.io.IOException: Target host must not be null的问题

当我遇到这个问题的时候,也在网上查找好半天.找到了一个和这个问题很类似的问题——java.lang.IllegalStateException: Target host must not be null 这个里面报的是IllegalStateException,翻译过来是非法状态异常,这个是url的状态,一般来说会是地址不正确(如:在地址的开头缺少http://). 不过,我遇到的是com.lidroid.xutils.exception.HttpException: java.io.IOExc