读书人

C# 尝试读取或写下受保护的内存。这通

发布时间: 2013-08-04 18:26:16 作者: rapoo

C# 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
这是一个接口的方法


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);


谁能帮解一下~!
[解决办法]
http://www.cnblogs.com/yiki/archive/2008/10/29/1321848.html

数据类型问题,

如果第一次调用正常,第二次调用失败检查是不是open 之后没有close (个人判断)
[解决办法]
数据类型没有匹配吧


[解决办法]
保证每个StringBuilder 的实例的Capacity足够的大
第一次调用成功后看下每个StringBuilder 的Capacity是否有变小,如果有变小就调整到足够大
[解决办法]
[DllImport("sdtapi.dll", EntryPoint = "ReadBaseInfos",//读取卡中基本信息
CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern int ReadBaseInfos(StringBuilder Name, StringBuilder Gender, StringBuilder Folk, StringBuilder BirthDay,
StringBuilder Code, StringBuilder Address, StringBuilder Agency, StringBuilder ExpireStart, StringBuilder ExpireEnd);
设置StringBuilder 的大小
[解决办法]
引用:
C# code

while (RunScan)
{
try


{
Name = new StringBuilder(31);
Gender = new StringBuilder(3);
Folk = new StringBuilder(10);
BirthDay = new StringBuilder(9);
Code = ne……



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

另外StringBuilder的实例初始化全部都放到while循环外面,只new一次
[解决办法]
传入写缓存用StringBuilder是对的,楼主第一次正确,说明不是参数类型的问题
建议:
1, 适当增大StringBuilder容量
2,不要在循环中每次New,在外面New好,循环内使用StringBuilder.Remove(0,sb.Length)清空内容即可

读书人网 >C#

热点推荐