Compatibilité 32 bits et 64 bits

Résolu
MEUCORACAO Messages postés 35 Date d'inscription jeudi 30 juin 2011 Statut Membre Dernière intervention 23 octobre 2018 - 8 janv. 2014 à 18:45
MEUCORACAO Messages postés 35 Date d'inscription jeudi 30 juin 2011 Statut Membre Dernière intervention 23 octobre 2018 - 16 mai 2014 à 17:16
Bonjour à tous,

Je me tourne vers vous car le problème ci-contre me chagrine depuis ce matin. En effet, je cherche à faire un code vba compatible 32 et 64 bits.
Le souci est que je tombe sur une "erreur de compilation : incompatibilité de type" sur la procédure
AddressOf LowLevelMouseProc
dans le Sub Hook_Mouse.

Je ne comprends pas pourquoi? Pouvez-vous m'éclairer de vos lumières?

Le bout de code sert à permettre l'exécution de la molette dans les combobox.


'-----Allows use of MouseWheel on designated ListBox/ComboBox on a form or, sheet if modified.--------
Option Explicit

#If Win64 Then
Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Declare PtrSafe Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long

Declare PtrSafe Function GetForegroundWindow Lib "user32" () As Long

Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(ByVal Destination As Long, ByVal Source As Long, ByVal Length As Long)

Declare PtrSafe Function SetWindowsHookEx Lib _
"user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, _
ByVal hmod As Long, ByVal dwThreadId As Long) As Long

Declare PtrSafe Function CallNextHookEx Lib "user32" (ByVal hHook As Long, _
ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long

Declare PtrSafe Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long

Declare PtrSafe Function GetLastError Lib "kernel32" () As Long ' Used this one to crack the problem.
#Else
Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long

Declare Function GetForegroundWindow Lib "user32" () As Long

Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(ByVal Destination As Long, ByVal Source As Long, ByVal Length As Long)

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

Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, _
ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long

Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long

Declare Function GetLastError Lib "kernel32" () As Long ' Used this one to crack the problem.
#End If

Type POINTAPI
X As Long
Y As Long
End Type

Type MSLLHOOKSTRUCT 'Will Hold the lParam struct Data
pt As POINTAPI
mouseData As Long ' Holds Forward\Bacward flag
flags As Long
time As Long
dwExtraInfo As Long
End Type

Const HC_ACTION = 0
Const WH_MOUSE_LL = 14
Const WM_MOUSEWHEEL = &H20A

Dim hhkLowLevelMouse, lngInitialColor As Long
Dim udtlParamStuct As MSLLHOOKSTRUCT

Public Const GWL_HINSTANCE = (-6)
Public intTopIndex As Integer
Public ObjUSF As UserForm, ObjList As Object

Function GetHookStruct(ByVal lParam As Long) As MSLLHOOKSTRUCT
' VarPtr returns address; LenB returns size in bytes.
CopyMemory VarPtr(udtlParamStuct), lParam, LenB(udtlParamStuct)
GetHookStruct = udtlParamStuct
End Function

Function LowLevelMouseProc _
(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'Avoid XL crashing if RunTime error occurs due to Mouse fast movement
On Error Resume Next
' \\ Unhook & get out in case the application is deactivated
If GetForegroundWindow <> FindWindow("ThunderDFrame", ObjUSF.Caption) Then
UnHook_Mouse
Exit Function
End If
If (nCode = HC_ACTION) Then
If wParam = WM_MOUSEWHEEL Then
'\\ Don't process Default WM_MOUSEWHEEL Window message
LowLevelMouseProc = True
'\\ Change Sheet&\DropDown names as required
With ObjList
'\\ if rolling forward increase Top index by 1 to cause an Up Scroll
If GetHookStruct(lParam).mouseData > 0 Then
.TopIndex = intTopIndex - 1
'\\ Store new TopIndex value
intTopIndex = .TopIndex
Else '\\ if rolling backward decrease Top index by 1 to cause _
'\\a Down Scroll
.TopIndex = intTopIndex + 1
'\\ Store new TopIndex value
intTopIndex = .TopIndex
End If
End With
End If
Exit Function
End If
LowLevelMouseProc = CallNextHookEx(0, nCode, wParam, ByVal lParam)
End Function

Sub Hook_Mouse()
' Statement to maintain the handle of the hook if clicking outside of the control.
' There isn't a Hinstance for Application, so used GetWindowLong to get handle.
If hhkLowLevelMouse < 1 Then hhkLowLevelMouse = SetWindowsHookEx(WH_MOUSE_LL, AddressOf LowLevelMouseProc, _
GetWindowLong(FindWindow("ThunderDFrame", ObjUSF.Caption), GWL_HINSTANCE), 0)
End Sub

Sub UnHook_Mouse()
If hhkLowLevelMouse <> 0 Then
UnhookWindowsHookEx hhkLowLevelMouse
hhkLowLevelMouse = 0
End If
End Sub


Je vous remercie par avance pour votre aide et vous souhaite une très bonne année et pleins de bonnes choses, soit dit en passant.

Cordialement,

Anthony
A voir également:

2 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 219
Modifié par ucfoutu le 9/01/2014 à 08:08
Bonjour,

les types sont à reconsidérer si 64 bits.
Ex :
Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

===>>
Public Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr

je te laisse traiter tes autres fonctions (je ne veux pas participer plus à ce genre d'appli)

PS : j'observe que tu ne prévois aucune compilation conditionnelle en fonction de la version Office/VBA ! ===>> c'est selon moi une erreur car traitement différent selon les cas. Les types ne sont à modifier comme montré en exemple
que si conjonction de deux conditions
: OS en 64 bits ET version VBA7 et non uniquement en fonction de l'OS !

Bonne chance
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
0
MEUCORACAO Messages postés 35 Date d'inscription jeudi 30 juin 2011 Statut Membre Dernière intervention 23 octobre 2018
9 janv. 2014 à 10:24
Bonjour ucfoutu,

Merci pour ta réaction. Je ne comptait pas sur toi pour tout changer mais me dire d'où cela peut provenir. Je vais essayer en changeant tous les long en longptr.
Donc tu pense qu'il est préférable de faire des conditions en if win64 & vba7?

En fait, j'essaie de faire une procédure compatible sur tous les office et os windows. Donc si on a un xp 64 bits avec un office 2007, il faut aussi évaluer ce cas. Je n'arrive pas à trouver sur le net une lite des API qui soit pour le vba7 et pour le win64.

tu n'aurais pas une petite idée.

Merci encore pour ton aide.
Cordialement,

Anthony
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 219
9 janv. 2014 à 13:19
Je crois t'avoir tout dit plus haut :
1) double compilation conditionnelle ; en tenant compte de l'OS, d'une part, et de la version Office, de l'autre.
2) Je refuse d'aller au-delà de ce que je t'en ai dit, s'agissant d'un mécanisme qui :
- soit tend à un sous-classement
- soit tant à "harponner"
(je ne le fais que pour moi et en courant mes risques. Cours les tiens comme tu l'entends. Ces risques existent et surgissent à la moindre erreur).
0
MEUCORACAO Messages postés 35 Date d'inscription jeudi 30 juin 2011 Statut Membre Dernière intervention 23 octobre 2018
9 janv. 2014 à 13:33
Non ce mécanisme, je l'ai trouvé sur le net. Il me permet d'utiliser la roulette de la souris dans un combobox pour faire défiler les différents choix de la liste. Si tu as une meilleure idée je suis preneur.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 219
9 janv. 2014 à 14:58
Je ne t'ai nullement parlé de sa finalité, mais de la méthode (harponnage) !
Je te laisse maintenant seul avec tes audaces.
0
MEUCORACAO Messages postés 35 Date d'inscription jeudi 30 juin 2011 Statut Membre Dernière intervention 23 octobre 2018
9 janv. 2014 à 17:19
C'est bon j'ai réussi à trouver. Merci encore
0