Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Passage de pointeur de structure en code non managé

2 réponses
Avatar
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 ?

Merci par avance.

2 réponses

Avatar
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.


Avatar
Xavier
Bonjour,

Merci pour ces informations. Il faut reconnaitre que le P/Invoke en C#
est relativement ardu ;)