我有一個 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)]在結構之上,但洗掉它不會破壞我的代碼。
提前致謝
uj5u.com熱心網友回復:
這...
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);
我認為這不會對任何事情產生負面影響(相反,如果您ToInt32()在 64 位行程中呼叫可能會拋出OverflowException),但最好讓IntPtr處理計算指向每個MyStruct元素的指標,您可以這樣做...
IntPtr iP = IntPtr.Add(myIntPtr, i * size);
……或者干脆這……
IntPtr iP = myIntPtr i * size;
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/399944.html
