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

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:

patricktoulon

XLDnaute Barbatruc
Donc c'est un joyeux b*rdel pour savoir comment faire ces foutues déclarations.
je n'ai qu'un mot
ExecuteExcel4Macro
LOL
diabolo.gif
 

Dudu2

XLDnaute Barbatruc
En fait je suis en 32 bits donc je ne peux pas tester en 64 bits.
Dans le Scroll Souris en ComboBox (bidule complexe) je n'ai pas laissé de Long, tout est en LongPtr, Handle ou pas. Ça fonctionne.

Si quelqu'un peut faire le test En VBA7 64 bits...
 

Pièces jointes

  • VBA Scroll Souris en ComboBox.xlsm
    41.9 KB · Affichages: 5

patricktoulon

XLDnaute Barbatruc
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
 

patricktoulon

XLDnaute Barbatruc
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

  • molette souris pour listebox2 et frame combobox sur userform ou feuille excel.xlsm
    60 KB · Affichages: 3

Dudu2

XLDnaute Barbatruc
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.
 

Dudu2

XLDnaute Barbatruc
@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.
 

Dudu2

XLDnaute Barbatruc
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)
 

Staple1600

XLDnaute Barbatruc
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)
 

Dudu2

XLDnaute Barbatruc
@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

  • InputBoxPerso Timer LongPtr.xlsm
    59.6 KB · Affichages: 2

Discussions similaires