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#
Répondre
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);
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
var pointer = new IntPtr(&myVariable);
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
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()
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
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 ».
- 1. Convertir IntPtr en int * en C#?
- 2. C#: Comment convertir long en ulong
- 3. C++ ULONG définitions à VB.NET ou équivalent C#?
- 4. Comment convertir un IntPtr en flux?
- 5. Comment "remplir" un paramètre IntPtr avec une valeur flottante?
- 6. En C#, j'ai un IntPtr à WIN32 WndProc. Quelle est la syntaxe pour l'appeler?
- 7. Quel est l'équivalent de IntPtr (C#) en Java?
- 8. Facile un? Accédez à la propriété d'un objet en utilisant une variable en C#
- 9. Comment convertir un IntPtr de nouveau dans un objet
- 10. C# Affecter une variable à un appel de classe
- 11. Arité variable en C?
- 12. Comment capturer une variable (C#)
- 13. IntPtr jeté contre nouvelle
- 14. Essayer de transmettre une variable C# booléenne à une variable javascript et la définir à
- 15. Différence entre une variable locale et une variable appelée à partir d'une méthode? C#
- 16. En utilisant une variable pour représenter une fonction dans C
- 17. Modifier une couleur d'arrière-plan de fenêtre, donné un handle IntPtr
- 18. C#: Récupération et utilisation d'un IntPtr * par réflexion
- 19. obtenir une chaîne à partir d'un octet [] en C#
- 20. Convertir une variable en un type représenté par une autre variable Type?
- 21. Accès à la variable C#
- 22. Obtenir un pointeur à la structure dans une carte C++
- 23. Comment obtenir une adresse en C?
- 24. affecter un type à une variable, utiliser une variable avec une classe statique générique
- 25. comment égale à 2 variable date C#
- 26. Comment obtenir une référence à un contrôle à partir de son nom de chaîne en C#
- 27. Obtenir la poignée de fenêtre en C#
- 28. IntPtr, SafeHandle et HandleRef - Expliqué
- 29. Comment accéder à la variable JS en C#
- 30. Obtenir un paramètre global en C#
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
Eh bien, j'ai besoin d'un ulong parce que IStream.Read a besoin d'un IntPtr à un ulong. – Ries