Pregunta

Necesito pasar una IntPtr a IStream.Read y el IntPtr debería apuntar a una variable ulong. ¿Cómo consigo este IntPtr que apunta a la variable ulong?

¿Fue útil?

Solución

La mejor manera es cambiar la definición IStream:

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

A continuación, puede escribir

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

Otros consejos

Creo que usted tiene que utilizar el método GCHandle si se quiere evitar código no seguro. No estoy seguro de cómo esto funciona con los tipos de valor en caja.

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

Si no puede utilizar código no seguro intente lo siguiente.

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

En algún momento más adelante, tendrá que llamar Marshal.FreeHGlobal en el valor "ptr".

var pointer = new IntPtr(&myVariable);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top