2009-03-27 8 views
0

Je dois passer un IntPtr à IStream.Read, et l'IntPtr doit pointer vers une variable ulong. Comment puis-je obtenir cet IntPtr qui pointe vers ma variable ulong?Obtenir un IntPtr à une variable ulong en C#

+0

Comme une note de côté pour les personnes répondant à cette question, il veut un ulong parce IntPtr de .NET est 64 bits sur les systèmes x64. – Powerlord

+0

Eh bien, j'ai besoin d'un ulong parce que IStream.Read a besoin d'un IntPtr à un ulong. – Ries

Répondre

2

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); 

alors vous pouvez écrire

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

Après avoir pensé que je me suis rendu compte que c'était ma meilleure option. IStream est après tout juste une interface. Pourquoi ne pas créer ma propre interface ... – Ries

0
var pointer = new IntPtr(&myVariable); 
+0

Bien que cela obtienne le pointeur, vous n'avez pas demandé au GC de le garder fixe, alors myVariable peut être déplacé et ce pointeur ne vous appartient plus. – Samuel

2

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 les types de valeur encadrés.

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

Cela approché travaillé. Intéressant j'ai encore besoin de Marshal.WriteInt64 la valeur de retour à ma variable ulong (peut-être était juste le débogué qui n'était pas assez intelligent si) – Ries

1

Si vous ne pouvez pas utiliser un code non sécurisé, 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 ».

Questions connexes