繁体   English   中英

如何将 IntPtr 转换为结构数组

[英]How to convert an IntPtr to array of structs

我有一个 IntPtr,它是一个指向结构数组的指针,我正在尝试将其转换为数组。

我试过了

Marshal.Copy(srcIntPtr, destIntPtrArray, 0, destIntPtrArray.Length);

但是在完成复制之后,我无法将目标数组内部的 IntPtr 转换为所需的结构,而我可以将 srcIntPtr 转换为结构,这当然只会给我第一个索引的数据。 看起来在完成复制之后,目标数组包含一堆损坏的 IntPtr

我也试过

    var size = Marshal.SizeOf(Marshal.ReadIntPtr(myIntPtr));

    for (int i = 0; i < length; i++)
    {
        IntPtr iP = new IntPtr(myIntPtr.ToInt64() + i * size);
    
        MyStruct ms =
            (MyStruct ) Marshal.PtrToStructure(iP, typeof(MyStruct ));
    }

这不会引发任何错误,但是我从源 IntPtr 中获取的结构数组的数据不准确。

这是我要转换为的结构

struct MyStruct
{
    public Categories categories;  
    public Dimensions dimensions;
}



public struct Categories {
    public double d;
    public double c;
    public double b;
    public double a;
}



struct Dimensions {
    public double v;
    public double e;
}

我在结构顶部有[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] ,但删除它不会破坏我的代码。

提前致谢

这个...

Marshal.ReadIntPtr(myIntPtr)

...返回一个IntPtr ,顾名思义。 当传递给Marshal.SizeOf() ...

var size = Marshal.SizeOf(Marshal.ReadIntPtr(myIntPtr));

...它返回它指向的MyStruct的大小,而是返回当前进程的IntPtr的大小(4 或 8 个字节)。 要获得MyStruct的非托管大小,您需要像这样调用SizeOf() ...

var size = Marshal.SizeOf<MyStruct>();

...或这个...

var size = Marshal.SizeOf(typeof(MyStruct));

此外, IntPtr的全部意义在于它与地址宽度无关,但您明确地将其检索为long ...

IntPtr iP = new IntPtr(myIntPtr.ToInt64() + i * size);

我认为这不会对任何事情产生负面影响(与在 64 位进程中调用ToInt32()相反,这可能会引发OverflowException ),但最好让IntPtr处理计算指向的指针每个MyStruct元素,你可以这样做......

IntPtr iP = IntPtr.Add(myIntPtr, i * size);

...或者只是这个...

IntPtr iP = myIntPtr + i * size;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM