C#根据内存地址数值,获取内存数据。求赐教

zxqiangwhere 2017-11-15 10:49:25
C++回调函数返回指针地址(string 类型),将string类型转换为Int64,然后将Int64转换为指针IntPtr,再将InPtr转为为结构体。
代码如下:
string VideoDatapTR = GetCmdAttrib(pCommandBuf, newBuffer, 1024, "DATASTRUCT");
IntPtr ptr = new IntPtr(Convert.ToInt64(VideoDatapTR));
_VIDEO_DATA_YUV2 yuv2 = (_VIDEO_DATA_YUV2)Marshal.PtrToStructure(ptr, typeof(_VIDEO_DATA_YUV2));
Marshal.FreeHGlobal(ptr);

结构体如下:
[StructLayout(LayoutKind.Sequential,CharSet = CharSet.Unicode)]
private struct _VIDEO_DATA_YUV2
{
public uint dwWidth;
public uint dwHeight;
public uint dwStride;
public uint dwPixelFormat;
public uint dwLength;
}
代码报错:
System.AccessViolationException:“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”


请问有人处理过这样的内存吗?求赐教
...全文
1094 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zxqiangwhere 2017-11-20
  • 打赏
  • 举报
回复
引用 6 楼 xian_wwq 的回复:
看了c++的代码, 结构体转换的时候丢了东西了 szVideoData去哪里了? 没有分配空间,访问的时候就是AccessViolation
我的截图没有更新,szVideoData在C++的结构体中已经去掉了
xian_wwq 2017-11-16
  • 打赏
  • 举报
回复
看了c++的代码, 结构体转换的时候丢了东西了 szVideoData去哪里了? 没有分配空间,访问的时候就是AccessViolation
zxqiangwhere 2017-11-15
  • 打赏
  • 举报
回复
引用 3 楼 xian_wwq 的回复:
string类型的地址?
lz最好贴下c调用的示例代码
struct转换还需要确认字节对齐方式

xian_wwq 2017-11-15
  • 打赏
  • 举报
回复
string类型的地址? lz最好贴下c调用的示例代码 struct转换还需要确认字节对齐方式
zxqiangwhere 2017-11-15
  • 打赏
  • 举报
回复
引用 1 楼 lescper2011 的回复:
一般是用ReadProcessMemory函数读取内存,你那句出异常了?
_VIDEO_DATA_YUV2 yuv2 = (_VIDEO_DATA_YUV2)Marshal.PtrToStructure(ptr, typeof(_VIDEO_DATA_YUV2)); 这句出异常
lescper2011 2017-11-15
  • 打赏
  • 举报
回复
一般是用ReadProcessMemory函数读取内存,你那句出异常了?
lescper2011 2017-11-15
  • 打赏
  • 举报
回复
引用 2 楼 zxqiangwhere 的回复:
[quote=引用 1 楼 lescper2011 的回复:] 一般是用ReadProcessMemory函数读取内存,你那句出异常了?
_VIDEO_DATA_YUV2 yuv2 = (_VIDEO_DATA_YUV2)Marshal.PtrToStructure(ptr, typeof(_VIDEO_DATA_YUV2)); 这句出异常[/quote] 这个指针出错了,指针对应的数据不是该结构体,你读下指针的数据。 可以用ReadProcessMemory或者用反汇编工具读取。

110,567

社区成员

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

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

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