C# 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

无常名 2011-01-25 03:39:55
这是一个接口的方法

int ReadBaseInfos( char * Name, char * Gender, char * Folk,
char *BirthDay, char * Code, char * Address,char *Agency, char * ExpireStart,char* ExpireEnd)

我在C#中调用,ReadBaseInfos方法第一次调用正常,第二次调用提示"尝试读取或写入受保护的内存。这通常指示其他内存已损坏。"

[DllImport("Sdtapi.dll")]
private static extern int ReadBaseInfos(StringBuilder Name, StringBuilder Gender, StringBuilder Folk, StringBuilder BirthDay, StringBuilder Code, StringBuilder Address, StringBuilder Agency, StringBuilder ExpireStart, StringBuilder ExpireEnd);


谁能帮解一下~!
...全文
46204 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
u011338805 2013-07-31
  • 打赏
  • 举报
回复
怎么new一个Image?
danielxu_2012 2013-05-28
  • 打赏
  • 举报
回复
谢谢谢谢,我也是同样的问题,就是没有考虑到照片上去我⊙﹏⊙b汗
xw5118234 2011-10-30
  • 打赏
  • 举报
回复
特来感谢楼主,我都搞了一天,数据类型、转换都试遍了也没有找出原因。
无常名 2011-04-27
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 chenwen_27 的回复:]

我特意登陆上来感谢楼主!
我用新中新的读卡器,遇到了和楼主相同的问题。
调用读卡函数时,vs提示:“尝试读取或写入受保护的内存……”,我检查了各种问题,参数类型调来调去,又用Marshal来搞非托管,仍旧报错,一整晚上都花在这个问题上了。
看了楼主的帖子,恍然大悟,果然是picturebox占用了图片文件,导致读卡函数执行失败。马上New一个image出来就搞定了,泪流满面啊。
被VS的……
[/Quote]

哥们,2点?苦啊。
chenwen_27 2011-04-27
  • 打赏
  • 举报
回复
我特意登陆上来感谢楼主!
我用新中新的读卡器,遇到了和楼主相同的问题。
调用读卡函数时,vs提示:“尝试读取或写入受保护的内存……”,我检查了各种问题,参数类型调来调去,又用Marshal来搞非托管,仍旧报错,一整晚上都花在这个问题上了。
看了楼主的帖子,恍然大悟,果然是picturebox占用了图片文件,导致读卡函数执行失败。马上New一个image出来就搞定了,泪流满面啊。
被VS的那句报错误导了,在内存上浪费无用功。

PS:如果厂家的DLL能够将错误信息写到一个log文件中就好了,直接提示:“图片文件被占用,XX函数执行失败”。
king2101 2011-04-11
  • 打赏
  • 举报
回复
我是用的新中新,在XP上很正常 但是在win7上出现了你这个问题。兄弟有何建议啊?
无常名 2011-01-27
  • 打赏
  • 举报
回复
解决了~!!!!!!!!!!!!!!!!!
int ReadBaseInfos( char * Name, char * Gender, char * Folk,char *BirthDay, char * Code, char * Address,char *Agency, char * ExpireStart,char* ExpireEnd)

这个方法还有一个功能是把一张bmp格式的图片放到我的应用程序目录下,每次读取的图片名字都是一样photo.bmp。所以第一次读取成功后,刚存入的图片还在使用中,第二次读取一张又以同样的名字放到这个路径下边,这就需要覆盖第一次读取的图片,而第一次读取的图片正在使用,所以此方法就出现错误。


非常感谢大家的帮助~!~!结贴~!
无常名 2011-01-27
  • 打赏
  • 举报
回复

Name = new StringBuilder(256);
Gender = new StringBuilder(256);
Folk = new StringBuilder(256);
BirthDay = new StringBuilder(256);
Code = new StringBuilder(256);
Address = new StringBuilder(256);
Agency = new StringBuilder(256);
ExpireStart = new StringBuilder(256);
ExpireEnd = new StringBuilder(256);
while (RunScan)
{
try
{
Name.Remove(0, Name.Length);
Gender.Remove(0, Gender.Length);
Folk.Remove(0, Folk.Length);
BirthDay.Remove(0, BirthDay.Length);
Code.Remove(0, Code.Length);
Address.Remove(0, Address.Length);
Agency.Remove(0, Agency.Length);
ExpireStart.Remove(0, ExpireStart.Length);
ExpireEnd.Remove(0, ExpireEnd.Length);


我这样试了一下,还是同样的问题啊。各位帮帮忙啊~!郁闷了~!
  • 打赏
  • 举报
回复
传入写缓存用StringBuilder是对的,楼主第一次正确,说明不是参数类型的问题
建议:
1, 适当增大StringBuilder容量
2,不要在循环中每次New,在外面New好,循环内使用StringBuilder.Remove(0,sb.Length)清空内容即可
xingyuebuyu 2011-01-26
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 zongbao516 的回复:]
C# code

while (RunScan)
{
try
{
Name = new StringBuilder(31);
Gender = new StringBuilder(3);
Folk = new StringBuilder(10);
BirthDay = new StringBuilder(9);
Code = ne……
[/Quote]

StringBuilder的实例Capacity的尽量设大点,可以都改为256,因为调用完ReadBaseInfos之后用StringBuilder的Length属性确定你读到的内容长度就可以了,排除Capacity过小造成的问题

另外StringBuilder的实例初始化全部都放到while循环外面,只new一次
无常名 2011-01-26
  • 打赏
  • 举报
回复

等。。。。。。。。。。。。。。。
无常名 2011-01-26
  • 打赏
  • 举报
回复
原 型:int ReadBaseInfos( char * Name, char * Gender, char * Folk,char *BirthDay, char * Code, char * Address,char *Agency, char * ExpireStart,char* ExpireEnd)

参 数:
Name [out] 字符型指针。需要在调用时分配内存,字节数不小31。
Gender [out] 字符型指针。需要在调用时分配内存,字节数不小3。
Folk [out] 字符型指针。需要在调用时分配内存,字节数不小10。
BirthDay [out] 字符型指针。需要在调用时分配内存,字节数不小9。
Code [out] 字符型指针。需要在调用时分配内存,字节数不小19。
Address [out] 字符型指针。需要在调用时分配内存,字节数不小71。
Agency [out] 字符型指针。需要在调用时分配内存,字节数不小31。
ExpireStart [out] 字符型指针。需要在调用时分配内存,字节数不小9。
ExpireEnd [out] 字符型指针。需要在调用时分配内存,字节数不小9。

返 回 值:
值 意义
1 正确
0 错误

*******************************************************************
这是调用的组件的方法。
无常名 2011-01-26
  • 打赏
  • 举报
回复
string 好像不行。出现错误。StringBuilder需要分配容量。
yinrongg 2011-01-26
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 zongbao516 的回复:]
引用 16 楼 ling3wei 的回复:
char * 对应 C# string 用 ANSI 修饰。

到底用什么啊,昨天查了一个是用string 或是 StringBuilder用ANSI修饰
[/Quote] 试试看啊,两个都可以,看情况定。如果使用StringBuilder大小应该不要分配的
无常名 2011-01-26
  • 打赏
  • 举报
回复
加分。。。。。。。。。。。。。。。。。。。。。。。
无常名 2011-01-26
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 ling3wei 的回复:]
char * 对应 C# string 用 ANSI 修饰。
[/Quote]
到底用什么啊,昨天查了一个是用string 或是 StringBuilder用ANSI修饰
yinrongg 2011-01-26
  • 打赏
  • 举报
回复
char * 对应 C# string 用 ANSI 修饰。
无常名 2011-01-26
  • 打赏
  • 举报
回复
关键是不它出错误啊~!你当时用的时候也出现过这个错误吗?
足球中国 2011-01-26
  • 打赏
  • 举报
回复
读身份证的。
这个好象不太好用。最好获一家。新中新的不错。
这个代码我也改了好久。不过刷卡不太零敏。
无常名 2011-01-26
  • 打赏
  • 举报
回复

while (RunScan)
{
try
{
Name = new StringBuilder(31);
Gender = new StringBuilder(3);
Folk = new StringBuilder(10);
BirthDay = new StringBuilder(9);
Code = new StringBuilder(19);
Address = new StringBuilder(71);
Agency = new StringBuilder(31);
ExpireStart = new StringBuilder(9);
ExpireEnd = new StringBuilder(9);
//打开端口
int intOpenRet = InitComm(pN);
if (intOpenRet != 1)
{
if (setAlarm != null)
setAlarm("阅读机具未连接");
continue;
}
//卡认证
int intReadRet = Authenticate();
if (intReadRet != 1)
{
CloseComm();
if (setAlarm != null)
setAlarm("请重新放卡...");
continue;
}
else
{
if (setAlarm != null)
setAlarm("卡认证成功,正在获取...");
}
//读取数据(第一次调用的时候不出错误,再次读取提示错误)

int intReadBaseInfosRet = ReadBaseInfos(Name, Gender, Folk, BirthDay, Code, Address, Agency,ExpireStart, ExpireEnd);
if (intReadBaseInfosRet != 1)
{
if (setAlarm != null)
setAlarm("读卡失败");
CloseComm();
continue;
}

}
catch
{
CloseComm();
}
CloseComm();
Thread.Sleep(200);
}
加载更多回复(12)

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧