Pergunta

Eu preciso passar um IntPtr para IStream.Read, eo IntPtr deve apontar para uma variável ulong. Como faço para obter este IntPtr que aponta para minha variável ulong?

Foi útil?

Solução

A melhor maneira é mudar a definição IStream:

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

Em seguida, você pode escrever

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

Outras dicas

Eu acredito que você tem que usar o método GCHandle se você quer evitar código inseguro. Eu não tenho certeza sobre como isso funciona com tipos de valor em caixa.

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

Se você não pode usar o código inseguro tente o seguinte.

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

Em algum momento mais tarde, você vai precisar ligar para Marshal.FreeHGlobal sobre o valor "ptr".

var pointer = new IntPtr(&myVariable);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top