//调用C的dll函数,函数前两个参数为入参,第三个为出参
[DllImport("NhImp.dll", EntryPoint = "getMembers", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
public static extern int getMembers(ref string nd, ref string ylzh, StringBuilder members);//调用
string nd = "2012";
string ylzh = "1412010103000029";
StringBuilder YBOutBuf = new StringBuilder(10240);
int retint = getNhMembers(ref nd, ref ylzh, YBOutBuf);一执行int retint = getNhMembers(ref nd, ref ylzh, YBOutBuf); 就报内存损坏错误,那位大侠指点下啊,谢谢!
解决方案 »
- 在c#中用g.Transform = new Matrix(1.0f,0.0f,0.0f, -1.0f,100.0f,800.0f)出现的问题
- 控件的标题(Text)
- Java用DES加密的字符串,C#怎么用DES进行解密?
- 关于字符串清零问题(急)
- 我的程序为什么运行好几次
- 为什么总是说:类型或命名空间ServiceProcess在System中不存在(是否缺少程序集引用?)--在线等
- 我想在microsoft visual studio 2005 的菜单里新增一个项,请问使用的是什么方法
- 求一段其名方法的lambda表达式的写法
- 在.NET 中如何释放DLL (别看分数少)
- 新手学起C#要在什么方面注意啊?能帮助我的,都给分!
- HttpWebRequest 获取验证码进行识别,验证码已经识别成功了,老是提示验证码错误 可能是cookie的问题,求高手解答
- 错那了,timer
两个 ref 去掉试试
2、不能简单把传出的char*就用StringBuilder
P/Invoke助手生成的是
[System.Runtime.InteropServices.DllImportAttribute("<Unknown>", EntryPoint="getMembers")]
public static extern int getMembers(System.IntPtr s1, System.IntPtr s2, ref System.IntPtr s3) ;
那个代码就是 加载他的dll 找到函数指针,给函数传了三个指针。第三个char* members = new char[10240];
private static extern int getMembers(IntPtr s1, IntPtr s2, IntPtr s3);private static IntPtr InStr(string str)
{
byte[] arr = new byte[str.Length * 2];
Encoding.ASCII.GetBytes(str, 0, str.Length, arr, 0);
IntPtr p = Marshal.AllocHGlobal(arr.Length);
Marshal.Copy(arr, 0, p, arr.Length);
return p;
}static void Main()
{
string nd = "...";
string ylzh = "..."; IntPtr s1 = InStr(nd);
IntPtr s2 = InStr(ylzh);
IntPtr s3 = Marshal.AllocHGlobal(10240); getMembers(s1, s2, s3); string members = Marshal.PtrToStringAnsi(s3); Marshal.FreeHGlobal(s1);
Marshal.FreeHGlobal(s2);
Marshal.FreeHGlobal(s3);
}这样试试
getMembers的函数原型贴出来