Traduire macros 32 bits en 64 bits

Bonjour,

Véritable novice, je fais appel au forum pour m'aider à traduire ce fichier libre que j'utilisais en 32 bits dans mon métier (HVAC) sauf que dans mon tout nouveau job, nos PC sont tous en 64 bits / Windows 11 et plus rien ne fonctionne.

Je pense que le sujet a déjà été maintes fois traité, mais en utilisant la fonction recherche du forum, je n'ai rien trouvé d'approchant.

J'ai bien trouvé des infos sur le site MICROSOFT

Cela n'a pas l'air compliqué pour des experts, mais pour moi c'est encore du javanais

Je vous mets le fichier en copie

Si quelqu'un a quelques instant à y consacrer, je suis preneur

Un grand merci d'avance

Bonjour,
A tester et adapter (voir web).
Cdlt.

#If Win64 Then
    Private Declare PtrSafe Function SetTimer Lib "user32" ( _
            ByVal HWnd As Long, ByVal nIDEvent As Long, _
            ByVal uElapse As Long, ByVal lpTimerFunc As LongPtr) As Long
    Private Declare PtrSafe Function KillTimer Lib "user32" ( _
            ByVal HWnd As Long, ByVal nIDEvent As Long) As Long
#Else
    Private Declare Function SetTimer Lib "user32" ( _
            ByVal HWnd As Long, ByVal nIDEvent As Long, _
            ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
    Private Declare Function KillTimer Lib "user32" ( _
            ByVal HWnd As Long, ByVal nIDEvent As Long) As Long
#End If

Bonjour,

@Jean-Eric

Les pointeurs (Hwnd) doivent être passés en LongPtr ainsi que les fonctions :

#If Win64 Then
    Private Declare PtrSafe Function SetTimer Lib "user32" ( _
            ByVal HWnd As LongPtr, ByVal nIDEvent As Long, _
            ByVal uElapse As Long, ByVal lpTimerFunc As Long) As LongPtr
    Private Declare PtrSafe Function KillTimer Lib "user32" ( _
            ByVal HWnd As LongPtr, ByVal nIDEvent As Long) As LongPtr
#Else
    Private Declare Function SetTimer Lib "user32" ( _
            ByVal HWnd As Long, ByVal nIDEvent As Long, _
            ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
    Private Declare Function KillTimer Lib "user32" ( _
            ByVal HWnd As Long, ByVal nIDEvent As Long) As Long
#End If

Re,
Bonjour Thev,
Pas spécialiste, ma proposition vient de Microsoft.

lien : Exemple ?

Edescamps peut s'amuser à tester.

Cdlt.

Merci Jean Eric

J'ai testé le fichier mais j'ai une erreur de compilation avec :

image

Eric,

Pas spécialiste, ma proposition vient de Microsoft.
Le problème se rapporte à la conversion éventuelle de la variable Long en LongPtr

Which Long should become LongPtr?

It's actually pretty easy to determine what requires LongPtr and what can stay as Long. The only things that require LongPtr are function arguments or return values that represent addresses in memory. This is because a 64-bit OS has a memory space that is too large to hold in a Long data type variable. Arguments or return values that represent data will still be declared Long even in 64-bit.

Je pense quand même qu'il y a au moins une erreur car HWnd représente toujours une adresse. A minima, le code devrait être celui-ci

#If Win64 Then
    Private Declare PtrSafe Function SetTimer Lib "user32" ( _
            ByVal HWnd As LongPtr, ByVal nIDEvent As Long, _
            ByVal uElapse As Long, ByVal lpTimerFunc As LongPtr) As Long
    Private Declare PtrSafe Function KillTimer Lib "user32" ( _
            ByVal HWnd As LongPtr, ByVal nIDEvent As Long) As Long
#Else
    Private Declare Function SetTimer Lib "user32" ( _
            ByVal HWnd As Long, ByVal nIDEvent As Long, _
            ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
    Private Declare Function KillTimer Lib "user32" ( _
            ByVal HWnd As Long, ByVal nIDEvent As Long) As Long
#End If
J'ai testé le fichier mais j'ai une erreur de compilation avec :
Essayer cette version

Re,
@Thev,
Ok ! Si on doit résumer pour les néophytes (dont moi), HWnd doit être systémattiquement un LongPtr.
Cdlt.

Ok ! Si on doit résumer pour les néophytes (dont moi), HWnd doit être systémattiquement un LongPtr.
Tout à fait et ce n'est pas terminé. 2 autres variables adresse doivent être passées en LongPtr

Private Type TTimer
  TID As Long
  DelaiT As Long
  TimerOn As Boolean
  AdProcEvent As LongPtr
  IsIdOn As Boolean
End Type
Private ActiveT As TTimer

Public Event OnTimer()

Sub Initialise(ByVal AdresseProc As LongPtr, ByVal ValDelai&)

ci-jointe nouvelle version

OK, la suite ci dessous à corriger

image

Merci de votre aide

salut à tous,

Juste pour info. Faire une recherche de SetTimer dans le fichier (Données de Crosoft).

14win32api-ptrsafe.zip (141.05 Ko)
OK, la suite ci dessous à corriger
ci-jointe version corrigée

Je le teste encore un peu, mais cela refonctionne, plus d'erreur.....

Un grand merci à vous tous pour vos contributions, les ingénieurs HVAC, plombiers et chauffagistes réunis vous remercient

Rechercher des sujets similaires à "traduire macros bits"