"内存被保护或内存被损坏" 在做第二代身份证扫描的时候,打开身份证读卡器,开始读卡.读第一张卡时可以正常读取,但是继续读第张卡时,则提示信息"内存被保护或内存被损坏".重新关闭软件则可以继续读取,但读卡器并没有关闭.重新打开软件可以继续读取,读一张再读第二张,则提示如上信息. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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;读卡过程: Pic_Identity_BM.Image = Image.FromFile("zp.bmp"); CloseComm();在这里对设备进行了关闭,是不是因为没有释放资源的问题,请问是什么原因???为什么重新启动下软件就可以了,如果重新Load下窗体可以吗??? } catch (Exception ex) { MessageBox.Show(this, ex.Message, "错误信息!", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1); } http://www.39g.com/html/dnet/cshare/2010/09/115194724942.htm希望是对你有帮助 像这样的外调函数一般都是C++语言写的,如果C#调用的话会因为参数类型不一致,弹出‘尝试读取写入受保护的内存。这通常指示其他内存已损坏’ 这个错误。通常解决办法是将他们的类型转换成一样的即可。比如从Int16转换成Int32之类的转换。你检查下你的类型转换吧! 把方法体单独写一个类,然后using语句块释放掉 请教一个C#卸载的问题 如何取出这些字符串中的内容 listView 加载图片的问题? 在C#中如何实现索引器? const和readonly 那位请给解释一下包装,小弟不懂 嘻嘻~~这里人气旺..跑来这里问了.. 如何弥补DataView的局限性 string类与String类有什么区别? 用C#怎样能够执行sql脚本 List中的元素不能修改? C#把常量定义在XML文件中,怎么来使用呢?每次都全都读取出来?
/// <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;
读卡过程:
CloseComm();
在这里对设备进行了关闭,是不是因为没有释放资源的问题,请问是什么原因???为什么重新启动下软件就可以了,如果重新Load下窗体可以吗???
}
catch (Exception ex)
{
MessageBox.Show(this, ex.Message, "错误信息!", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1);
}
希望是对你有帮助