首页 新闻 搜索 专区 学院

将数据从托管对象封送到非托管内存块:尝试读取或写入受保护的内存。这通常指示其他内存已损坏

0
悬赏园豆:30 [已解决问题] 解决于 2012-12-05 21:13

C#调研C++代码出现:尝试读取或写入受保护的内存。这通常指示其他内存已损坏

结构体

[StructLayout(LayoutKind.Sequential)]
public struct DEVICE_DATA
{
public byte[] a;
public int b;
public int c;
public byte[] d;
public byte[] e;
public byte[] f;
public int g;
}

 

device_DATA是在C#中赋值,想得到他的指针,却一直报错,

调用代码:

IntPtr record= Marshal.AllocHGlobal(Marshal.SizeOf(device_DATA));;
try
{
Marshal.StructureToPtr(device_DATA, record, true);

//在上面报错尝试读取或写入受保护的内存。这通常指示其他内存已损坏。

int error = FuncStatisticProvider.SendDeviceData(handle, record);
}
catch (Exception ex)
{
Marshal.FreeHGlobal(record);
}
行者,无疆的主页 行者,无疆 | 初学一级 | 园豆:175
提问于:2012-12-04 21:35
< >
分享
最佳答案
1

Marshal.SizeOf(device_DATA) 看看这个大小,是否正确。

鉴于你在结构体里定义的是 byte[],同时没有指定 ArraySize,Marshal.SizeOf可能不能正确计算出大小。

收获园豆:25
Launcher | 高人七级 |园豆:45045 | 2012-12-05 09:12

恩,你这个是对的,不过不是这个问题,C++程序的问题 已经解决了

行者,无疆 | 园豆:175 (初学一级) | 2012-12-05 21:11
其他回答(1)
0

是否和字节对齐有关,VC++的默认对齐是8

参考一些总结 http://blog.csdn.net/binarie/article/details/6636595

收获园豆:5
2012 | 园豆:20513 (高人七级) | 2012-12-05 08:43
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册