簡體   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