XL 2016 VBA - Déclarations des fonctions l'API Windows

  • Initiateur de la discussion Initiateur de la discussion Dudu2
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Dudu2

XLDnaute Barbatruc
Bonjour,

Je voudrais avoir la confirmation de la manière de déclarer les fonctions de l'API Windows selon les constantes de compilation prédéfinies. Avec l'exemple de GetParent().

J'ai vu ce type de déclaration...
VB:
#If VBA7 Then
    #If Win64 Then
        Declare PtrSafe Function GetParent Lib "user32" (ByVal hwnd As LongPtr) As LongPtr
    #Else
        Declare PtrSafe Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
    #End If
#Else
    Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
#End If

Mais la doc Windows dit:
Les variables LongPtr (long integer sur les systèmes 32 bits, longLong integer sur les systèmes 64 bits)
Donc ceci devrait suffire non ?
VB:
#If VBA7 Then
    Declare PtrSafe Function GetParent Lib "user32" (ByVal hwnd As LongPtr) As LongPtr
#Else
    Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long
#End If

D'autre part, question subsidiaire, dans cette page par ailleurs très utile, je vois ça:
VB:
#If Win64 Then
    Declare PtrSafe Function GetWindowLongPtr Lib "user32" Alias "GetWindowLongPtrA" (ByVal hwnd As LongPtr, ByVal nIndex As Long) As LongPtr
#Else
    Declare PtrSafe Function GetWindowLongPtr Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As LongPtr, ByVal nIndex As Long) As LongPtr
#End If

Qu'est-ce qui est la "vraie" référence à la fonction ? GetWindowLongPtr ou GetWindowLongPtrA / GetWindowLongA?


Merci par avance.
 
Dernière édition:
chez moi VBA7 32 bits
et la molette marche aussi
sur mon pc portable perso
par contre sur le pc portable du travail 2016 32 bit c'est dans les clous

je resort mon hok (listbox/frame/combo ) qui lui est en vba7 64 ou vb6 dans les déclarations d'api et bien entendu je n'ai pas longptr partout
résultat comme tu peux le voir ca fonctionne aussi bien
par contre celui là fonctionne sur les deux pcs
demo.gif
 
ma conclusion perso et ça n'engage que moi
les déclarations doivent se faire non pas sur vba7 ou 6 mais sur le win64 ou win32
et le win32 doit être les déclarations vb6 car comme tu peux le voir elle fonctionne sur 2013 32 bits VBA7
pour le test j'ai meme remplacé les déclaration vba7 par celle de vb6
VB:
'*******************************************
'multi hook simplifié (molete souris sur activx)
'défilement dans controls liste frame
'patricktoulon
'**********************************
Option Explicit
#If VBA7 Then
    'Private Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As LongPtr, ByVal Source As LongPtr, ByVal Length As LongPtr)
    'Private Declare PtrSafe Function SetWindowsHookEx Lib "USER32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As LongPtr, ByVal hmod As LongPtr, ByVal dwThreadId As Long) As LongPtr
    'Private Declare PtrSafe Function CallNextHookEx Lib "USER32" (ByVal hHook As LongPtr, ByVal nCode As Long, ByVal wParam As LongPtr, lParam As Any) As LongPtr
    'Private Declare PtrSafe Function UnhookWindowsHookEx Lib "USER32" (ByVal hHook As LongPtr) As Long
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Long, ByVal Source As Long, ByVal Length As Long)
    Private Declare Function SetWindowsHookEx Lib "USER32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
    Private Declare Function CallNextHookEx Lib "USER32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long
    Private Declare Function UnhookWindowsHookEx Lib "USER32" (ByVal hHook As Long) As Long

#Else
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Long, ByVal Source As Long, ByVal Length As Long)
    Private Declare Function SetWindowsHookEx Lib "USER32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
    Private Declare Function CallNextHookEx Lib "USER32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long
    Private Declare Function UnhookWindowsHookEx Lib "USER32" (ByVal hHook As Long) As Long

#End If

Private Type POINTAPI: X As Long: Y As Long: End Type
Private Type MSLLHOOKSTRUCT: pt As POINTAPI: mouseData As Long: flags As Long: time As Long: dwExtraInfo As Long: End Type
Private Const HC_ACTION = 0
Private Const WH_MOUSE_LL = 14
Private Const WM_MOUSEWHEEL = &H20A
Private udtlParamStuct As MSLLHOOKSTRUCT
Public plHooking As Long    ' permet de savoir si le hook est activé ou pas
Public CtrlHooked As Object    ' sera associé à la ListBox

tes conclusions ne peuvent avoir qu'une conséquence sur les versions 64
et comme tu tourne comme tu viens de le dire sur 32 bits alors toutes tes conclusions ne sont que des supputations et je te le prouve en te donnant mon fichier exemple de hook molette souris dans le quel les déclaration sont bien en VBA6

ma conclusion a moi c'est que le 32 bits n'a pas besoins de tout ça
 

Pièces jointes

Bonjour à tous,

@Staple1600, peux-tu essayer d'afficher les ComboBoxes et de scroller à l'intérieur par la molette souris STP ?

L'approche de split Win64 / Win32 est aussi une option qui me semble parfaitement valide.
Et dans le Win64, replacer tous les Long par des LongLong sans plus avoir de référence à LongPtr ni PtrSafe pour rester clair.
 
@Staple1600, Merci de ta confirmation pour le tout LongPtr au lieu de Long pour les fonctions API utilisées.

Ceci dit (Win64 / Win32), pourquoi conserver des déclarations pour VBA6 (Office 2007) qui date de 15 ans.
Avec PtrSafe et LongPtr on ne fait plus qu'une seule déclaration et ça couvre 64 bits et 32 bits.
Et si un ancêtre se pointe avec un Office de l'an 1000, on lui donne la marche à suivre:
- Supprimer les PtrSafe et remplacer les LongPtr par des Long.

Je vais faire ça maintenant, exit les doubles déclarations.
 
Exemple:
VB:
'----------------------------------------------------------------------------------------------------------
'Déclarations API. Pour Office 2007 et en dessous remplacer supprimer PtrSafe et remplacer LongPtr par Long
'----------------------------------------------------------------------------------------------------------
Private Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
                                 ByVal Destination As LongPtr, _
                                 ByVal Source As LongPtr, _
                                 ByVal Length As LongPtr)
 
Re

@Dudu2
Tout ce que je sais c'est que beaucoup de classeurs (j'ai du mal à appeler des classeurs Excel des applis 😉) réalisés sur des Office 32 bits plantent quand l'utilisateur migre sur un Office 64 bits
D'où cette histoire de PrtSafe
(d'ailleurs signalé par Excel lui-même -> voir ma copie écran dans cette discussion)
 
@Staple1600, oui, tu as raison, c'est pour ça que je pense que PtrSafe et LongPtr sont des précautions.

Maintenant, dans ma démarche un peu exagérée qui consiste à transformer les Long en LongPtr, il y a peut-être une erreur car en 64 bits évidemment que le type Long coexiste avec le type LongLong.
Le problème c'est qu'on ne sait pas trop dans les déclarations API les Long qui doivent rester Long et ceux qui doivent passer en LongLong, c'est à dire en PtrSafe + LongPtr, mis à part les Handles dont ont sait qu'il s sont LongPtr.

Pourrais-tu essayer les boutons de ce fichier STP ?
 

Pièces jointes

- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
46
Affichages
2 K
Retour