Passage de pointeur de structure en code non managé

Le
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.
  • Partager ce contenu :
Vos réponses
Trier par : date / pertinence
Paul Bacelar
Le #12412371
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" 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
Le #12411851
Bonjour,

Merci pour ces informations. Il faut reconnaitre que le P/Invoke en C#
est relativement ardu ;)
Poster une réponse
Anonyme