在做第二代身份证扫描的时候,打开身份证读卡器,开始读卡.读第一张卡时可以正常读取,但是继续读第张卡时,则提示信息"内存被保护或内存被损坏".重新关闭软件则可以继续读取,但读卡器并没有关闭.重新打开软件可以继续读取,读一张再读第二张,则提示如上信息.

解决方案 »

  1.   

    region 二代证阅读器接口
            /// <summary>
            /// 二代证阅读器接口
            /// </summary>
            /// <returns></returns>
            [DllImport("kernel32", EntryPoint = "GetModuleFileNameA")]
            static extern int GetModuleFileName(int hModule, string lpFileName, int nSize);        //初始化设备(串口:1-16,USB:1001-1016)
            [DllImport("termb.dll")]
            static extern int InitComm(int X);
            //读卡完毕后,关闭设备
            [DllImport("termb.dll")]
            static extern int CloseComm();
            //证卡验证,返回值不需要判断
            [DllImport("termb.dll")]
            static extern int Authenticate();
            //读基本信息,iActive=1;读卡成功后照片信息存放在zp.bmp文件中;读追加地址,iActive=3;
            [DllImport("termb.dll")]
            static extern int Read_Content(int Active);        //读卡成功后调用以下方法获取相应的身份证信息:
            // const int ERR_SUCCESS = 1;//成功
            // const int ERR_FAIL      = 0;//失败
            // const int ERR_SAVESERIALNO = -1;//存序列号失败 未授权机具
            // const int ERR_CANCELSERIALNO = -1;//序列号取消  未授权机具
            // const int ERR_OPENECOMM = -2;//打开串口
            // const int ERR_CLOSECOMM = -3;//关闭串口
            // const int ERR_SAMSTATUS = -4;//取sam状态失败
            // const int ERR_SAMID      = -5;//取samID失败
            // const int ERR_FINDCARD = -6;//找卡错误
            // const int ERR_SELECTCARD = -7;//选卡错误
            // const int ERR_BASEINFO = -8;//读取基本信息错误
            // const int ERR_APPINFO = -9;//读取附加信息错误
            // const int ERR_MNGINFO = -10;//读取MNG信息错误
            //姓名
            [DllImport("termb.dll")]
            static extern int GetPeopleName(StringBuilder lpBuffer, uint strLen);
            //地址
            [DllImport("termb.dll")]
            static extern int GetPeopleAddress(StringBuilder lpBuffer, uint strLen);
            //身份证号码
            [DllImport("termb.dll")]
            static extern int GetPeopleIDCode(StringBuilder lpBuffer, uint strLen);
            //出生日期
            [DllImport("termb.dll")]
            static extern int GetPeopleBirthday(StringBuilder lpBuffer, uint strLen);
            //民族
            [DllImport("termb.dll")]
            static extern int GetPeopleNation(StringBuilder lpBuffer, uint strLen);
            //性别
            [DllImport("termb.dll")]
            static extern int GetPeopleSex(StringBuilder lpBuffer, uint strLen);
            //发证机关
            [DllImport("termb.dll")]
            static extern int GetDepartment(StringBuilder lpBuffer, uint strLen);
            //证件开始日期
            [DllImport("termb.dll")]
            static extern int GetStartDate(StringBuilder lpBuffer, uint strLen);
            //证件结束日期
            [DllImport("termb.dll")]
            static extern int GetEndDate(StringBuilder lpBuffer, uint strLen);
            //照片
            [DllImport("termb.dll")]
            static extern int GetPhotoBMP(StringBuilder lpBuffer, uint strLen);
            //追加地址
            [DllImport("termb.dll")]
            static extern int GetAppAddress(StringBuilder lpBuffer, uint strLen);
            #endregion        private static int intPort = 0; //端口号
            private static int iRet = 0;
    读卡过程:
      

  2.   

      Pic_Identity_BM.Image = Image.FromFile("zp.bmp");
                                    CloseComm();
    在这里对设备进行了关闭,是不是因为没有释放资源的问题,请问是什么原因???为什么重新启动下软件就可以了,如果重新Load下窗体可以吗???

                }
                catch (Exception ex)
                {
                    MessageBox.Show(this, ex.Message, "错误信息!", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
                }
      

  3.   

    http://www.39g.com/html/dnet/cshare/2010/09/115194724942.htm
    希望是对你有帮助
      

  4.   

    像这样的外调函数一般都是C++语言写的,如果C#调用的话会因为参数类型不一致,弹出‘尝试读取写入受保护的内存。这通常指示其他内存已损坏’ 这个错误。通常解决办法是将他们的类型转换成一样的即可。比如从Int16转换成Int32之类的转换。你检查下你的类型转换吧!
      

  5.   

    把方法体单独写一个类,然后using语句块释放掉