Question

Je dois passer un IntPtr à IStream.Read et IntPtr doit pointer vers une variable ulong. Comment puis-je obtenir ce IntPtr qui pointe vers ma variable ulong?

Était-ce utile?

La solution

La meilleure façon est de changer la définition IStream:

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

Ensuite, vous pouvez écrire

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

Autres conseils

Je crois que vous devez utiliser la méthode GCHandle si vous voulez éviter le code dangereux. Je ne suis pas sûr de la façon dont cela fonctionne avec des types de valeur en boîte.

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

Si vous ne pouvez pas utiliser le code dangereux essayez ce qui suit.

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

À un certain moment plus tard, vous devrez appeler Marshal.FreeHGlobal sur la valeur « PTR ».

var pointer = new IntPtr(&myVariable);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top