C#调用c的dll出错,急!急!急!

ctjtn 2013-07-05 02:05:48
函数原型:void _stdcall ReleaseMemory(unsigned char **OUTData) 函数功能:释放内存
C#调用: [DllImport("a.dll")]
public static extern void ReleaseMemory(ref StringBuilder OUTData);
出现错误:尝试读取或写入受保护的内存。这通常指示其他内存已损坏
用string也是同样的错误,无助啊!
...全文
389 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
可可西外 2013-07-06
  • 打赏
  • 举报
回复
好高端,打个酱油路过。
ctjtn 2013-07-05
  • 打赏
  • 举报
回复
引用 11 楼 soaringbird 的回复:
byte或void**是这样用的: void* pv = IntPtr.Zero.ToPointer(); void** OutData= &pv; 当然你用ref byte*也可以。 取内容用Marshal.PtrToStringAnsi(new IntPtr(*OutData,length),); 这是void**的时候
问题解决了,最后是用得void **。真是太感谢了
soaringbird 2013-07-05
  • 打赏
  • 举报
回复
Marshal.PtrToStringAnsi(new IntPtr(*OutData),长度); 或者Marshal.PtrToStringAnsi(new IntPtr(OutData),长度); 用ref的时候
soaringbird 2013-07-05
  • 打赏
  • 举报
回复
byte或void**是这样用的: void* pv = IntPtr.Zero.ToPointer(); void** OutData= &pv; 当然你用ref byte*也可以。 取内容用Marshal.PtrToStringAnsi(new IntPtr(*OutData,length),); 这是void**的时候
ctjtn 2013-07-05
  • 打赏
  • 举报
回复
引用 9 楼 soaringbird 的回复:
释放内存需要原来的地址,但是你取数据的地方用了托管类型,恐怕就不能再封送回去了.你还是两个方法都用byte**或者void**来获得传出数据吧
引用 6 楼 ctjtn 的回复:
ProcessServicePrimitive函数OutData用byte**或者void**都出错,不过用ref byte*可以,ReleaseMemory函数也没问题,但这样的话,我怎么获得ProcessServicePrimitive返回的OutData参数值,它正确返回的是XML字符串。我用(*OutData).ToString()获得只是一个整数。?
soaringbird 2013-07-05
  • 打赏
  • 举报
回复
释放内存需要原来的地址,但是你取数据的地方用了托管类型,恐怕就不能再封送回去了.你还是两个方法都用byte**或者void**来获得传出数据吧
引用 6 楼 ctjtn 的回复:
ctjtn 2013-07-05
  • 打赏
  • 举报
回复
引用 7 楼 yqb_6280180 的回复:
C中需要标志开发接口给C#调用吗
dll别人早就写好了,我现在准备用C#开发上层应用
yqb_last 2013-07-05
  • 打赏
  • 举报
回复
C中需要标志开发接口给C#调用吗
ctjtn 2013-07-05
  • 打赏
  • 举报
回复
引用 5 楼 soaringbird 的回复:
到底是正确还是报错?
在释放内存之前用调用函数进行相应的操作,如下:int _stdcall ProcessServicePrimitive(unsigned char **OUTData, unsigned int &OUTDataLen,SUPPORT_LAYER SupportLayerType, ADDR Addr,const unsigned char *Xml, unsigned int XmlLen) 这的意思是上面OutData实参我用的ref StringBuilder,调用的结果都是正确的,用ref string也可以 。调用完后,要释放内存,调用ReleaseMemory就出现我说的错误了
soaringbird 2013-07-05
  • 打赏
  • 举报
回复
到底是正确还是报错?
ctjtn 2013-07-05
  • 打赏
  • 举报
回复
引用 3 楼 soaringbird 的回复:
[quote=引用 2 楼 ctjtn 的回复:] [quote=引用 1 楼 soaringbird 的回复:] [DllImport("a.dll")] unsafe public static extern void ReleaseMemory(void ** OUTData);
这样也不行哦[/quote] 你这个看说明应该是释放内存的,就是释放OUTData所指向的指针所指向的内存的,能不能正确执行还要看你指定的OutData实参对不对。[/quote] OutData实参我用的ref StringBuilder,调用的结果都是正确的,用ref string也可以
soaringbird 2013-07-05
  • 打赏
  • 举报
回复
引用 2 楼 ctjtn 的回复:
[quote=引用 1 楼 soaringbird 的回复:] [DllImport("a.dll")] unsafe public static extern void ReleaseMemory(void ** OUTData);
这样也不行哦[/quote] 你这个看说明应该是释放内存的,就是释放OUTData所指向的指针所指向的内存的,能不能正确执行还要看你指定的OutData实参对不对。
ctjtn 2013-07-05
  • 打赏
  • 举报
回复
引用 1 楼 soaringbird 的回复:
[DllImport("a.dll")] unsafe public static extern void ReleaseMemory(void ** OUTData);
这样也不行哦
soaringbird 2013-07-05
  • 打赏
  • 举报
回复
[DllImport("a.dll")] unsafe public static extern void ReleaseMemory(void ** OUTData);

110,534

社区成员

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

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

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