您的位置:首页 > 编程语言 > C语言/C++

C#读取C++编写的DLL时遇到的一个问题

2012-10-30 09:36 573 查看
最近在做一个C#项目,要调用一个C++编写的DLL,结果出了点问题,现将问题及解决方法记录如下:

问题描述:

1、DLL函数描述:

int hex_a(unsigned char *hex,char *a,unsigned char length);

功能: 将16 进制数转换为ASCII 字符。

参数:

hex: 16 进制数

a: 输出的ASCII 字符

length: 16 进制数的长度

返回: =0 成功

<>0 失败

2、我的引入:

[DllImport("F:\\C++\\intellectDFIPublish121023\\dll\\mwrf32.dll", EntryPoint = "hex_a",

CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]

public static extern Int16 hex_a(Byte hex, ref Byte asc, Int16 len);

3、报错:


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

4、解决过程:
上网上查了一下,有其他博主有过一些总结,说可能导致这个错误的可能原因有很多,然后我找了找,没结果,最后查到一篇相当的文章(/article/7152830.html),我将导入改为:
[DllImport("F:\\C++\\intellectDFIPublish121023\\dll\\mwrf32.dll", EntryPoint = "hex_a",

CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]

public static extern Int16 hex_a(ref Byte hex, ref Byte asc, Int16 len);

问题解决了,我想了想原因,主要是我觉得参数hex并不需要返回值,所以不需要ref,而asc需要返回值,就用了ref,结果就出错了,看来对ref的理解还不够呀,原来作为引用传值还起着类似指针的作用,需要牢记!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: