[英]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.