调用非托管dll内存错误的问题

devie 2009-05-13 04:00:22
函数原型:int ReadCard(char *room, char *gate,char *stime, char *guestname, char *guestid, char *track1, char *track2, long *cardno, int *st)

引用方式:
[DllImport("MainDll.dll", EntryPoint = "ReadCard", CharSet = CharSet.Ansi)]
private static extern int ReadCard(StringBuilder room, StringBuilder gate, StringBuilder stime, StringBuilder icCode, StringBuilder guestid, StringBuilder t1, StringBuilder t2, ref UInt32 cardno, ref int st);

StringBuilder room = new StringBuilder(10);
StringBuilder gate = new StringBuilder(10);
StringBuilder stime = new StringBuilder(30);
StringBuilder guestname = new StringBuilder(128);
StringBuilder idcard = new StringBuilder(32);
UInt32 icCode = 0;
StringBuilder t1 = new StringBuilder(64);
StringBuilder t2 = new StringBuilder(64);
int state = -1;
int result = ReadCard(room, gate, stime, guestname, idcard, t1, t2, ref icCode, ref state);


两台电脑一台运行很顺畅,而另外一台电脑报错。
最后一行报“尝试读取或写入受保护的内存。这通常指示其他内存已损坏”错误,
...全文
199 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
迷路神码 2011-09-13
  • 打赏
  • 举报
回复
C#和VC的内存对齐方式不一致导致的问题。
qiuzhijun 2011-08-26
  • 打赏
  • 举报
回复
楼主,可以把你调用爱迪尔的C#代码发给我吗?348174@qq.com
qqiuzaihui 2009-05-19
  • 打赏
  • 举报
回复
解决了就好, 帮顶。
devie 2009-05-19
  • 打赏
  • 举报
回复
问题解决,还好,我写的代码没问题,对方给错我Dll了
我想杀人。
devie 2009-05-18
  • 打赏
  • 举报
回复
现在对于dll已经没有希望了,提供dll的企业什么也问不出来,甚至都不知道用什么语言开发的。
现在参数是传出的,不是传入的,用string更不行。intptr也试了,但是也不行,哪位高手知道比较全面的IntPtr的使用方法。
光宇广贞 2009-05-15
  • 打赏
  • 举报
回复
不是什么区别的问题。

它用什么编码方式编译的库文件,你就只能传入什么样的编码方式。

还有,建议不要用 stringbuilder 传入参数了,试试改为string,你通过stringbuilder得到string 容易是吧。
devie 2009-05-14
  • 打赏
  • 举报
回复
顶起
devie 2009-05-14
  • 打赏
  • 举报
回复
我的程序最初调试通过了,而且现在在那台机子上运行也很稳定,但是另外一台机子却出现了这个问题。不知道这个和系统环境有没有关系!
devie 2009-05-14
  • 打赏
  • 举报
回复
大哥,不是不和他们联系,现在一些软件开发商太差劲了,我电话都快冒烟了,找了十几个人,都不知道,甚至他们公司的人不知道他们的程序用什么语言写的。
这两种方式的处理有什么区别吗?我可以分别试一下。
zlkingdom 2009-05-14
  • 打赏
  • 举报
回复
同意楼上的意见,现在看一下编码类型是否相符
光宇广贞 2009-05-14
  • 打赏
  • 举报
回复
你别在这儿着急了。

去和DLL供应商商量一下。

说不定是那个DLL的问题。

像这种,很可能是字串操作错误,是编码的问题。

可是DLL是用multi bytes 还是 unicode 编译的?你不知道是吧。
那我们也就不知道。
devie 2009-05-14
  • 打赏
  • 举报
回复
有谁能解决呀!
hylovett 2009-05-13
  • 打赏
  • 举报
回复
纯顶了....
devie 2009-05-13
  • 打赏
  • 举报
回复
改成CharSet.Unicode也不行,这个都试过了
devie 2009-05-13
  • 打赏
  • 举报
回复
不知道是怎么编译的,这是一个智能卡的读卡程序,dll是购买的,对方也什么提供不了
对了,左右的这些参数都是out类型的
光宇广贞 2009-05-13
  • 打赏
  • 举报
回复
机器不一样,可能是系统长度不一样。


你的那个dll 是用 multiple char 还是 unicode 编译的,先了解一下,否则上层调用会异常。

这种事儿只会出现在字符串的操作上。
光宇广贞 2009-05-13
  • 打赏
  • 举报
回复
CharSet = CharSet.Ansi)]


问题出在这里。


换成 CharSet.Unicode 试试。
devie 2009-05-13
  • 打赏
  • 举报
回复
这些代码最初的时候调试都通过了,只是换到另外一台机子后出现了这些问题,原来的那台机子还是好的用。
zhulong1111 2009-05-13
  • 打赏
  • 举报
回复
恩 顶下
光宇广贞 2009-05-13
  • 打赏
  • 举报
回复
内存入侵,
可能是有变量被当做指针用了……

你查一下自己的代码。
加载更多回复(1)

110,539

社区成员

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

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

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