Passage de pointeur de structure en code non managé
2 réponses
Xavier
Bonjour,
Dans un programme en C#, j'utilise la fonction Win32 SendMessage() que
je déclare comme ceci :
[DllImport("user32.dll",CharSet = CharSet.Auto)]
static extern int SendMessage(
IntPtr hWnd,
[MarshalAs(UnmanagedType.U4)] int Msg,
IntPtr wParam,
IntPtr lParam);
Par l'attribut StructLayoutAttribute, j'ai créé une structure C#
reprenant une structure existance en Win32.
Or, je dois passer un pointeur vers cette structure au paramètre wParam
de SendMessage. Je procède donc avec le mot clé "ref" comme ceci :
SendMessage(hWnd, Msg, ref structure, lParam);
Or, le compilateur refuse pour impossibilité de convertir le paramètre 3
de ref structure vers IntPtr.
Si je redéclare SendMessage comme ceci :
[DllImport("user32.dll",CharSet = CharSet.Auto)]
static extern int SendMessage(
IntPtr hWnd,
[MarshalAs(UnmanagedType.U4)] int Msg,
ref structure wParam,
IntPtr lParam);
ça fonctionne bien. Mais je ne peux évidemment pas procéder comme ceci
(j'utilise SendMessage ailleurs dans mon programme qui n'utilise pas du
tout ce paramètre).
Comment faire pour passer l'adresse de la structure à SendMessage ? Faut
il passer en mode unsafe ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Paul Bacelar
Passer un pointeur, ce n'est pas passer une référence et encore moins dans un environnement contenant un Garbage Collector qui peut déplacer les objets à sa guise.
Commencez par verrouiller votre structure en mémoire pour qu'elle ne ait plus la bougeotte avec le mot clé "fixed".
Et passer un Handle et pas une référence.
http://msdn.microsoft.com/msdnmag/issues/04/10/NET/ http://www.pinvoke.net/ -- Paul Bacelar
"Xavier" wrote in message news:
Bonjour,
Dans un programme en C#, j'utilise la fonction Win32 SendMessage() que je déclare comme ceci :
[DllImport("user32.dll",CharSet = CharSet.Auto)] static extern int SendMessage( IntPtr hWnd, [MarshalAs(UnmanagedType.U4)] int Msg, IntPtr wParam, IntPtr lParam);
Par l'attribut StructLayoutAttribute, j'ai créé une structure C# reprenant une structure existance en Win32.
Or, je dois passer un pointeur vers cette structure au paramètre wParam de SendMessage. Je procède donc avec le mot clé "ref" comme ceci :
SendMessage(hWnd, Msg, ref structure, lParam);
Or, le compilateur refuse pour impossibilité de convertir le paramètre 3 de ref structure vers IntPtr.
Si je redéclare SendMessage comme ceci :
[DllImport("user32.dll",CharSet = CharSet.Auto)] static extern int SendMessage( IntPtr hWnd, [MarshalAs(UnmanagedType.U4)] int Msg, ref structure wParam, IntPtr lParam);
ça fonctionne bien. Mais je ne peux évidemment pas procéder comme ceci (j'utilise SendMessage ailleurs dans mon programme qui n'utilise pas du tout ce paramètre).
Comment faire pour passer l'adresse de la structure à SendMessage ? Faut il passer en mode unsafe ?
Merci par avance.
Passer un pointeur, ce n'est pas passer une référence et encore moins dans
un environnement contenant un Garbage Collector qui peut déplacer les objets
à sa guise.
Commencez par verrouiller votre structure en mémoire pour qu'elle ne ait
plus la bougeotte avec le mot clé "fixed".
Et passer un Handle et pas une référence.
http://msdn.microsoft.com/msdnmag/issues/04/10/NET/
http://www.pinvoke.net/
--
Paul Bacelar
"Xavier" <me@nowhere.com> wrote in message
news:Xns9657F40503B31harkofreefr@193.252.117.183...
Bonjour,
Dans un programme en C#, j'utilise la fonction Win32 SendMessage() que
je déclare comme ceci :
[DllImport("user32.dll",CharSet = CharSet.Auto)]
static extern int SendMessage(
IntPtr hWnd,
[MarshalAs(UnmanagedType.U4)] int Msg,
IntPtr wParam,
IntPtr lParam);
Par l'attribut StructLayoutAttribute, j'ai créé une structure C#
reprenant une structure existance en Win32.
Or, je dois passer un pointeur vers cette structure au paramètre wParam
de SendMessage. Je procède donc avec le mot clé "ref" comme ceci :
SendMessage(hWnd, Msg, ref structure, lParam);
Or, le compilateur refuse pour impossibilité de convertir le paramètre 3
de ref structure vers IntPtr.
Si je redéclare SendMessage comme ceci :
[DllImport("user32.dll",CharSet = CharSet.Auto)]
static extern int SendMessage(
IntPtr hWnd,
[MarshalAs(UnmanagedType.U4)] int Msg,
ref structure wParam,
IntPtr lParam);
ça fonctionne bien. Mais je ne peux évidemment pas procéder comme ceci
(j'utilise SendMessage ailleurs dans mon programme qui n'utilise pas du
tout ce paramètre).
Comment faire pour passer l'adresse de la structure à SendMessage ? Faut
il passer en mode unsafe ?
Passer un pointeur, ce n'est pas passer une référence et encore moins dans un environnement contenant un Garbage Collector qui peut déplacer les objets à sa guise.
Commencez par verrouiller votre structure en mémoire pour qu'elle ne ait plus la bougeotte avec le mot clé "fixed".
Et passer un Handle et pas une référence.
http://msdn.microsoft.com/msdnmag/issues/04/10/NET/ http://www.pinvoke.net/ -- Paul Bacelar
"Xavier" wrote in message news:
Bonjour,
Dans un programme en C#, j'utilise la fonction Win32 SendMessage() que je déclare comme ceci :
[DllImport("user32.dll",CharSet = CharSet.Auto)] static extern int SendMessage( IntPtr hWnd, [MarshalAs(UnmanagedType.U4)] int Msg, IntPtr wParam, IntPtr lParam);
Par l'attribut StructLayoutAttribute, j'ai créé une structure C# reprenant une structure existance en Win32.
Or, je dois passer un pointeur vers cette structure au paramètre wParam de SendMessage. Je procède donc avec le mot clé "ref" comme ceci :
SendMessage(hWnd, Msg, ref structure, lParam);
Or, le compilateur refuse pour impossibilité de convertir le paramètre 3 de ref structure vers IntPtr.
Si je redéclare SendMessage comme ceci :
[DllImport("user32.dll",CharSet = CharSet.Auto)] static extern int SendMessage( IntPtr hWnd, [MarshalAs(UnmanagedType.U4)] int Msg, ref structure wParam, IntPtr lParam);
ça fonctionne bien. Mais je ne peux évidemment pas procéder comme ceci (j'utilise SendMessage ailleurs dans mon programme qui n'utilise pas du tout ce paramètre).
Comment faire pour passer l'adresse de la structure à SendMessage ? Faut il passer en mode unsafe ?
Merci par avance.
Xavier
Bonjour,
Merci pour ces informations. Il faut reconnaitre que le P/Invoke en C# est relativement ardu ;)
Bonjour,
Merci pour ces informations. Il faut reconnaitre que le P/Invoke en C#
est relativement ardu ;)