Frage

Ich brauche einen IntPtr zu IStream.Read passieren, und die IntPtr auf eine ulong Variable anweisen. Wie bekomme ich diese IntPtr, die auf meine ulong Variable Punkte?

War es hilfreich?

Lösung

Der beste Weg ist, um die IStream-Definition zu ändern:

void Read([Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] byte[] pv,
          int cb, /*IntPtr*/ ref int pcbRead);

Dann können Sie schreiben

int pcbRead = 0;
Read(..., ref pcbRead);

Andere Tipps

Ich glaube, Sie die GCHandle Methode verwenden, wenn Sie unsicher Code vermeiden wollen. Ich bin nicht sicher, wie das funktioniert mit boxed Werttypen.

var handle = GCHandle.Alloc(myVar, GCHandleType.Pinned);
var ptr = handle.AddrOfPinnedObject()

Wenn Sie unsicher Code nicht versuchen, die folgende verwenden können.

var myValue = GetTheValue();
var ptr = Marshal.AllocHGLobal(Marshal.SizeOf(typeof(ulong));
Marshal.StructureToPointer(ptr, myValue, false);

Irgendwann später, müssen Sie Marshal.FreeHGlobal auf dem „ptr“ Wert nennen.

var pointer = new IntPtr(&myVariable);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top