C#调用C++的DLL 出现:“尝试读取或写入受保护的内存”

a220315410 2010-08-31 11:42:01
最近做的项目,外壳是用C#写的,核心代码使用C++写的。在C#调用C++的DLL的过程中发现了以下的错误:尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
以下是C++的函数实现:
#pragma comment(linker, "/SECTION:MYSEC,RWS")

#pragma data_seg("MYSEC")

char ResultBuffer[10000]; //ResultBuffer 是共享数据段中的一个char型数组,用来实现跨进程通信的

#pragma data_seg()
extern "C" __declspec(dllexport) char* GetRecordInfo()
{
OutputDebugStringA(ResultBuffer);
return ResultBuffer;
}

C#下函数声明如下:
[DllImport("HooksLib.dll")]
public static extern StringBuilder GetRecordInfo();

调用时,可以在DbgView中看到 ResultBuffer的值是正确的,但是在C#的代码中发生了尝试读取或写入受保护的内存。这通常指示其他内存已损坏的错误。
原来猜想是C#和C++中Char长度不一样,C#占两个字节,C++一个字节的问题,但是把Char转成了wchar_t也还是错。
花了两天时间,没能解决问题。希望有哪位高手,指导下。
...全文
171 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
a220315410 2010-09-01
  • 打赏
  • 举报
回复
谢谢,解决了问题的感觉总是很爽的。不过还是不太清楚C#和C++共享内存会出现什么问题。继续关注。
baifucn 2010-09-01
  • 打赏
  • 举报
回复
恭喜楼主 哈哈。。。。 有空还要向你学习呢
a220315410 2010-09-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lazy_2010 的回复:]
StringBuilder 修改成 IntPtr
[/Quote]
如何从IntPtr获得string值已经搞定了,使用 Marshal.PtrToStringAnsi可以获得string值,谢谢lazy_2010的指点。
a220315410 2010-09-01
  • 打赏
  • 举报
回复
StringBuilder 修改成 IntPtr的确不会出现尝试读取或写入受保护的内存的错误,但是我该怎么在C#中从IntPtr获得string型的数据呢?,能请lazy_2010说明下么,小弟不太明白。
a220315410 2010-09-01
  • 打赏
  • 举报
回复
哦,能请freelaxy解释下,C#和C++共享同一片内存会有哪些不好的影响么?
lazy_2010 2010-09-01
  • 打赏
  • 举报
回复
StringBuilder 修改成 IntPtr
freelaxy 2010-09-01
  • 打赏
  • 举报
回复
你应该庆幸没通过, C/C#共享一片内存是一个很不好的方法.



=======================================================
FreeLaxy, your backup.
=======================================================

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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