很头痛的问题:C#调用c++的dll时候出现“尝试读取或写入受保护的内存”错误

iaimg 2010-10-11 10:46:08
/*****************************************************************
** 输入参数hDevice: 设备句柄,为Mf_Open_Reader返回值
** 输入参数 data: 指向数据缓存的指针
** 输入参数dataLen: 指示data缓存的长度,字节为单位(注企业信息最大为1920个字节)
** 输入参数 Key: 6字节的读写密钥,此参数为NULL时使用默认密钥"s_rfid"
** 函数返回值: 0 读操作成功
*****************************************************************/
HEATH2ND_API int WINAPI Mf_R_EntInfo(HANDLE hDevice, char *data, long *dataLen, unsigned char *Key);
以上c++给的接口说明,
c#调用如下:
[DllImport("heath2nd.dll")]
private static extern int Mf_R_EntInfo(IntPtr hDevice, ref string data, long dataLen, string Key);
Mf_R_EntInfo(OpenHandel, ref cards, 1920, "s_rfid");
运行这里就报“尝试读取或写入受保护的内存”错误呢,其中data我试了几种类型都不行。
调用如下方法就没问题:
/*****************************************************************
** 输入参数hDevice: 设备句柄,为Mf_Open_Reader返回值
** 输入参数pCardID: 卡片序列号回写值
** 函数返回值: 0 读卡片序列号操作成功
*****************************************************************/
HEATH2ND_API int WINAPI MF_Read_SN(HANDLE hDevice, unsigned long *pCardID);

请高手指教
...全文
147 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
gomoku 2010-10-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 iaimg 的回复:]
接口给出的是char类型!
[/Quote]
所以我才说 - "用byte[]也可以"
iaimg 2010-10-11
  • 打赏
  • 举报
回复
大家顶下啊,不要沉下去啊!
vrhero 2010-10-11
  • 打赏
  • 举报
回复
加上CharSet属性指示输入为ANSI编码,.NET中的字符类型都是Unicode编码...
[DllImport("heath2nd.dll", CharSet=CharSet.Ansi)]
iaimg 2010-10-11
  • 打赏
  • 举报
回复
接口给出的是char类型!
gomoku 2010-10-11
  • 打赏
  • 举报
回复
static extern int Mf_R_EntInfo(IntPtr hDevice, StringBuilder data, int dataLen, string Key);

StringBuilder sb = new StringBuilder(1920),
Mf_R_EntInfo(OpenHandel, sb, 1920, "s_rfid");

如果不是字符串,用byte[]也可以。
iaimg 2010-10-11
  • 打赏
  • 举报
回复
StringBuilder,string[],char[]都试过还是这种错误!
vrhero 2010-10-11
  • 打赏
  • 举报
回复
把ref string改成StringBuilder试试...

.NET的string类型和其他语言不一样...
gomoku 2010-10-11
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 ling3wei 的回复:]
long *dataLen 对应C# 的 int
[/Quote]
(也更正3楼)对应ref int
yinrongg 2010-10-11
  • 打赏
  • 举报
回复
long *dataLen 对应C# 的 int
chazikai24 2010-10-11
  • 打赏
  • 举报
回复
[DllImport("heath2nd.dll")]
private static extern int Mf_R_EntInfo(IntPtr hDevice,StringBuilder data, int32 dataLen, byte Key);

这几个参数说明上都是输入参数,没有返回值的,所以不用ref。data肯定是StringBuilder。
这些api对应关系,请参考http://blog.csdn.net/sjzlxd/archive/2009/02/27/3940246.aspx

111,129

社区成员

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

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

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