Erreur sur la fonction "GetCaretPos"

Résolu
Mrreivax Messages postés 100 Date d'inscription mercredi 9 juin 2004 Statut Membre Dernière intervention 26 juin 2010 - 4 nov. 2006 à 00:02
TMONOD Messages postés 256 Date d'inscription mardi 25 novembre 2003 Statut Membre Dernière intervention 6 novembre 2009 - 4 nov. 2006 à 11:50
Quan j'exécute le code ci-dessous, il y a une erreur au niveau de GetCaretPos(xyPOS)...
Je pige pas pourquoi, il me dit:
"Un appel à la fonction PInvoke 'WindowsApplication1!WindowsApplication1.Form1::GetCaretPos' a déséquilibré la pile. Cela peut se produire, car la signature PInvoke managée ne correspond pas à la signature cible non managée. Vérifiez que la convention d'appel et les paramètres de la signature PInvoke correspondent à la signature non managée cible."

Public
Structure POINTAPI

       Dim x
As Int32

       Dim y
As Int32

End
Structure

Public
Declare
Function GetCaretPos
Lib
"user32" (
ByVal lpPoint
As POINTAPI)
As
Long

Private
Sub RichTextBox1_KeyDown(
ByVal sender
As
Object,
ByVal e
As System.Windows.Forms.KeyEventArgs)
Handles RichTextBox1.KeyDown

       Dim xyPOS
As POINTAPI
       GetCaretPos(xyPOS) '<= Erreur... Why??

       Me.Text = xyPOS.x &
" ; " & xyPOS.y

End
SubMais pourqoi??? Si quelqu'un a la réponse... Merci!!!

Xavier

4 réponses

TMONOD Messages postés 256 Date d'inscription mardi 25 novembre 2003 Statut Membre Dernière intervention 6 novembre 2009 1
4 nov. 2006 à 09:47
Salut,
La signature d'une fonction c'est :
- Le nombre de paramètres passés, leur type, leur ordre et leur mode (byref, byval))
- Le type de la valeur renvoyée en final.

Ton programme passe ta variable XYpos en paramètre et tu attend que cette fonction modifie ta variable pour que tu l'utilise par la suite, tu dois donc la passer byref
  pour que l'api puisse la modifier.

BOOL GetCaretPos(



    LPPOINT  lpPoint  // address of structure to receive coordinates
   ); 


...tu vois c'est marqué dans win32.hlp , c'est que c'est vrai !!

A+

Jcbé[^]
3
Mrreivax Messages postés 100 Date d'inscription mercredi 9 juin 2004 Statut Membre Dernière intervention 26 juin 2010 7
4 nov. 2006 à 10:56
Merci TMONOD!
En effet!
Maintenant sa donne ceci!
Public

Declare
Function GetCaretPos
Lib
"user32" (
ByRef lpPoint
As POINTAPI)
As
IntegerEncore merci!!

Xavier
3
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
4 nov. 2006 à 09:58
Sinon en .Net, les anciens Long deviennent des Integer, donc tu dois aussi changer le type de retour de ta fonction en As Integer.

Julien.
0
TMONOD Messages postés 256 Date d'inscription mardi 25 novembre 2003 Statut Membre Dernière intervention 6 novembre 2009 1
4 nov. 2006 à 11:50
De rien ce fut un plaisir !!

Jcbé[^]
0
Rejoignez-nous