结构体数组的指针的内容如何从非托管到托管...

st0429 2007-07-25 01:27:02
谢谢关注...
结构体数组的指针的内容如何从非托管到托管...
部分代码如下:
//Event是结构体struct
IntPtr pEvent = new IntPtr();
int size = Marshal.SizeOf(typeof(Event));
pEvent = Marshal.AllocHGlobal(size * 1000);
uint pReadCount = 0;
if (-1 == M8_GetEventsFromBuf(ui_IP, pEvent, (uint)(size *1000), ref pReadCount))
{
Event[] events = new Event[pReadCount];
for (int k = 0; k < pReadCount; k++)
{
events[k] = new Event();
}
IntPtr ptr = new IntPtr();
ptr = Marshal.AllocHGlobal(size);
for (int i = 0; i < pReadCount; i++)
{
ptr = Marshal.ReadIntPtr(pEvent, i * size);
//问题在这里,为何ptr = 0呢?
events[i] = (Event)Marshal.PtrToStructure(ptr, typeof(Event));

...
...
再次感谢...
...全文
305 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
st0429 2007-07-29
  • 打赏
  • 举报
回复
好的,谢谢
我暂时用unsafe弄了,我会按你的方法试一下.
qqchen79 2007-07-25
  • 打赏
  • 举报
回复
M8_GetEventsFromBuf的C/C++函数声明是什么样子?
主要是pEvent,类型是Event* 还是 Event **?

如果是Event* :
Event[] events = new Event[pReadCount];
IntPtr ptr = pEvent;
for (int i = 0; i < pReadCount; i++)
{
events[i] = (Event)Marshal.PtrToStructure(ptr, ...);
ptr += size;
}

如果是Event** :
Event[] events = new Event[pReadCount];
for (int i = 0; i < pReadCount; i++)
{
IntPtr ptr = Marshal.ReadIntPtr(pEvent, i * Marshal.SizeOf(IntPtr));
events[i] = (Event)Marshal.PtrToStructure(ptr, ...);
}

如果还有问题,把Event结构的声明(C和C#)贴出来。

}
st0429 2007-07-25
  • 打赏
  • 举报
回复
是啊,怎么说呢
没有系统学过C#,总觉得应该有方法可以解决吧
又选用了它,总不能绕过这个嘛.
期待哪位帮帮我
soaringbird 2007-07-25
  • 打赏
  • 举报
回复
这种方式转来转去,不如unsafe代码更方便
st0429 2007-07-25
  • 打赏
  • 举报
回复
pEvent是IntPtr 移动不对...
我试过pEvent不偏移,可以读出第一个结构,偏移不对,后面的读不出来
Fortner 2007-07-25
  • 打赏
  • 举报
回复
pEvent+i*size 有可能要改成 pEvent+i*(int)(size/4)或者pEvent+i*size/4 ,因为是IntPtr,这几种都试试看吧,没做过这种.net的东西,只是靠以前C的经验来猜测
Fortner 2007-07-25
  • 打赏
  • 举报
回复
for (int i = 0; i < pReadCount; i++)
{
//ptr = Marshal.ReadIntPtr(pEvent, i * size);
events[i] = (Event)Marshal.PtrToStructure(pEvent+i*size, typeof(Event));
..............
这样试试看吧,不保证成功........
st0429 2007-07-25
  • 打赏
  • 举报
回复
对,我看MSDN上的例子是指针的数组,
结构体数组指针不能这样吗,有没有一个正统的方法呢?
先谢谢你
Fortner 2007-07-25
  • 打赏
  • 举报
回复
ptr = Marshal.ReadIntPtr(pEvent, i * size);
这个函数的意思是从一个指针数组里返回一个指针,pEvent只不过是结构体数组,而不是指针数组,这样结果返回的是一个int值........就是说返回的是pEvent+i*size*4之后的4字节转化为int后的值(32位机)这个值指向哪里还真难说。
st0429 2007-07-25
  • 打赏
  • 举报
回复
自己顶一下,
高手帮帮忙.

110,561

社区成员

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

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

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