IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Windows API ByRef lParam As Any vs lParam As Any


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur aéronautique
    Inscrit en
    Octobre 2018
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur aéronautique

    Informations forums :
    Inscription : Octobre 2018
    Messages : 216
    Par défaut Windows API ByRef lParam As Any vs lParam As Any
    Bonjour,

    J'utilise énormément de déclarations de l'API Windows, mais je me rends compte que j'ai négligé quelques aspects.

    Y-a-t'il notamment une différence entre les déclarations suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    'https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-sendmessage
    Public Declare PtrSafe Function SendMessage Lib "user32.dll" Alias "SendMessageA" ( _
        ByVal hwnd As LongPtr, _
        ByVal wMsg As Long, _
        ByVal wParam As Long, _
              lParam As Any) As Long
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Public Declare Function PtrSafe SendMessage Lib "user32.dll" Alias "SendMessageA" ( _
        ByVal hwnd As LongPtr, _
        ByVal wMsg As Long, _
        ByVal wParam As Long, _
        ByRef lParam As Any) As Long

    J'imagine que dans la deuxième déclarations, il faille que je précise lParam:=ByVal value lors des appels, mais que ce n'est pas forcément nécessaire avec la première déclaration ?

    Pouvez-vous s'il vous plaît m'en dire davantage à ce sujet, car des suspecte des p'tits bugs potentiels dans mes scripts ?

    Merci par avance

  2. #2
    Expert confirmé
    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Par défaut
    Bonjour,

    Les arguments des API sont par référence par défaut.
    Il n'y a donc pas de différence.

    Par contre :
    - wParam est un LongPtr
    - la fonction SendMessage renvoie un LongPtr

    La déclaration correcte pour 64bits est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, lParam As Any) As LongPtr
    Pour le lParam, son contenu varie en fonction du message envoyé.
    C'est pour cela qu'il est ByRef as Any.
    Avec cette déclaration on peut envoyer ce qu'on veut : une variable par référence, un pointeur par valeur...

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur aéronautique
    Inscrit en
    Octobre 2018
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur aéronautique

    Informations forums :
    Inscription : Octobre 2018
    Messages : 216
    Par défaut
    Merci pour ces précisions , il y a vrai que j'utilise mon script sur des versions de VBA 6 / 7 en 32 et 64 bits, donc pour dire...

    Je vrais donc revoir les différentes déclarations, car c'est sûr que ça n'aide pas à éviter d'éventuels bugs... En fait, je me sers de cet outils https://www.rondebruin.nl/win/dennis...sapiviewer.htm qui en réfère bon nombre sans pour autant être exhaustif. Etrangement, la déraction de SendMessage est bien cette que tu mentionnes, mais concernant PostMessage (que je n'utilise pas vraiment d'ailleurs), il resort :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Declare PtrSafe Function PostMessage Lib "user32" Alias "PostMessageA" ( _
        ByVal hwnd As LongPtr, _
        ByVal wMsg As Long, _
        ByVal wParam As LongPtr, _
        ByVal lParam As LongPtr) As Long
    Du coup, j'émets des doutes quand à la crédébilité de cet outil. Je sais qu'il y a aussi des tables comme https://www.codingdomain.com/visualb...api/datatypes/ qui listes les équivalences, mais je ne n'en ai pas trouvé pour du 64 bits...

  4. #4
    Expert confirmé
    Avatar de Arkham46
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    5 865
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 5 865
    Par défaut
    La seule source fiable est celle de microsoft :
    https://www.microsoft.com/en-us/down...s.aspx?id=9970

    Il n'y a pas tout mais c'est déjà beaucoup.

    Sinon mettre lParam en ByVal LongPtr n'est pas une erreur.
    C'est juste incohérent si SendMessage n'est pas présenté de manière identique.

    SendMessage et PostMessage sont identiques sur la forme (le premier est synchrone, le deuxième asynchrone).

  5. #5
    Membre éclairé
    Homme Profil pro
    Ingénieur aéronautique
    Inscrit en
    Octobre 2018
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur aéronautique

    Informations forums :
    Inscription : Octobre 2018
    Messages : 216
    Par défaut
    Il me semble avoir déjà entrevu cette resource, sans trop y prêter attention . Je vais donc me baser sur cette resource.

    Pour infos, j'avais aussi rencontré des problèmes pour contrôller le menu et accèder aux tooltips d'une application externe. J'y suis quelque peu arrivé avec UI Automation, mais il subsiste des problèmes. Je reprends donc espoir ...

  6. #6
    Membre éclairé
    Homme Profil pro
    Ingénieur aéronautique
    Inscrit en
    Octobre 2018
    Messages
    216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur aéronautique

    Informations forums :
    Inscription : Octobre 2018
    Messages : 216
    Par défaut
    Dans le cas où par exemple SendMessage renvoit une valeur telle que la longueur d'un buffer ou le nombre d'éléments d'une list box, est-ce que je peux déclarer lRet comme Long voire même Integer (voire example ci-dessous) ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    '
    Public Property Get count() As Integer
     
        If Not (className = "ListBox" Or className = "ComboBox") Then GoTo ERROR_HANDLE
     
        Select Case className
        Case "ListBox": count = API.SendMessage(hwnd:=pHwnd, wMsg:=API.LB_GETCOUNT, wParam:=0&, lParam:=0&)
        Case "ComboBox": count = API.SendMessage(hwnd:=pHwnd, wMsg:=API.CB_GETCOUNT, wParam:=0&, lParam:=0&)
        End Select
     
        Exit Property
     
    ERROR_HANDLE:
     
    End Property
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    '
    Public Property Get className() As String
     
        className = VBA.Space$(255)
     
        Dim lRet As Long: lRet = API.GetClassName(hwnd:=pHwnd, lpClassName:=className, nMaxCount:=Len(className))
     
        className = VBA.left$(className, lRet)
     
    End Property
    Merci encore

Discussions similaires

  1. Manipulation du registre windows [APIs]
    Par developersystem dans le forum Windows
    Réponses: 2
    Dernier message: 28/08/2007, 01h19
  2. [VBscript] Comment utiliser les windows API en vbs
    Par daniel_gre dans le forum VBScript
    Réponses: 3
    Dernier message: 21/05/2007, 18h14
  3. Windows API
    Par couet dans le forum Windows
    Réponses: 4
    Dernier message: 15/05/2006, 13h31
  4. Windows API
    Par datax dans le forum Windows
    Réponses: 1
    Dernier message: 22/08/2005, 10h58
  5. [Windows]Api win32 pour java
    Par cpanette dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 27/06/2005, 15h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo