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:

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Pour la deuxième question il faut distinguer le nom déclaré dans votre module, c'est vous qui en décidez et le nom de l'alias qui est le nom interne de la fonction dans sa librairie et que vous ne pouvez pas changer.

Le code suivant pourrait très bien fonctionner en appelant GetToto
Code:
Option Explicit
#If Win64 Then
    Declare PtrSafe Function GetToto Lib "user32" Alias "GetWindowLongPtrA" (ByVal hwnd As LongPtr, ByVal nIndex As Long) As LongPtr
#Else
    Declare PtrSafe Function GetToto Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As LongPtr, ByVal nIndex As Long) As LongPtr
#End If
Quant à savoir quelle fonction choisir, ce sont des fonctions avec des comportements un peu différents.
A vous d'explorer l'api pour en connaître les spécificités et différences suivant ce que vous voulez faire.

Pour la première question :
Je ne fais plus appel aux fonctions de la librairie "user32" à partir de vba mais si vous réfléchissez aux déclaration conditionnelles, vous comprendrez. Une part concerne la version VBA l'autre l'autre la version windows
 
Dernière édition:

Dudu2

XLDnaute Barbatruc
Bonjour @Hasco,
Merci pour ton retour.
Donc c'est bien l'Alias qui est le nom interne. J'ai eu quelques doutes car le terme Alias désigne plutôt un nom alternatif qu'un nom original.

D'autre part je comprends bien que ces déclarations conditionnelles sont faites pour le contexte VBA.
C'est lourdingue à cause des multiples répétitions.
Mais je me demande bien comment tu fais appel aux fonctions de l'API si tu ne les déclares pas dans le VBA.
A moins de faire comme @patricktoulon avec ses multiples executeexcel4macro qui ne sont pas si faciles à mettre au point.
 

Hasco

XLDnaute Barbatruc
Repose en paix
re

En fait, en interne la fonction ne doit pas s'appeller comme ça.
Souvent le nom des fonctions en interne est plus compliqué et versionné.
Elle sont donc déclarées avec un Alias qui à ce niveau porte bien son nom, pour faire le pont entre l'extérieur et la fonction.

Mais je me demande bien comment tu fais appel aux fonctions de l'API si tu ne les déclares pas dans le VBA.

Simplement ce sont des choix de programmation, en sachant que jamais aucun choix n'est bon ni mauvais. Il est ce qu'il est en fonction d'une situation particulière dans des conditions particulières et un temps particulier.
N'espérez pas pouvoir tout couvrir. Il vous faut simplement être conscient de ce que vous faites et surtout pourquoi. C'est tout
 

patricktoulon

XLDnaute Barbatruc
re
qu'est ce que mon cher @Dudu2 ne comprends pas

en gros les déclarations c'est fait pour que vba compile et utilise les api (librairie)

ma méthodes executeexcel4macro appelle directement la librairie dans l'instanté

je fait comme ça pour des run compatible 32/64 sans me casser la tête

attention ca se limite aux plus connue et utilisées de la user32 shell,kernel

si je devais être simpliste en declarant en fait tu variabilise les fonction de la librairie dans VBA

attention avec l'alias j'ai constaté avec des version excel et access (64) sur certaines fonctions qu'il y avais des bugs
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
Attention aussi aux argument tel que machin as Rect ou bien encore truc as any etc...
en 64 elle se transforme en autre chose sur certaines librairie comme GDI par exemple

de meme que pour "As rect par exemple dans les decaration 32 on pouvais marquer "As Choufleur"
et dans l'enumeration a la place de

type Rect
top as long
left as long
right as long
bottom as long
end type

on pouvait faire
type Choufleur
top as long
left as long
right as long
bottom as long
end type

CA!! sur certaines librairies ou fonctions de la librairie on peut plus le faire en 64
 

patricktoulon

XLDnaute Barbatruc
re
de même que ;::
et ca je l'ai vu plus d'une fois!
les déclârations simplifiée ne sont plus accepté sur certaines bécanes en 64 et sur d’autres oui (et là j’ai aucune idée du pourquoi)

par exemple et là c'est du vécu

sur deux pc au boulot win10 et office 2016 64

ces déclarations simplifiées ci dessous fonctionnent sur l'un et pas sur l'autre

FindWindowA
Declare ptrsafe Function FindWindowA Lib "user32" ( ByVal lpClassName$, ByVal lpWindowName$) As Long

GetWindowLongA
Declare ptrsafe Function GetWindowLongA Lib "user32" ( ByVal hwnd&, ByVal nIndex&) As Long
 

patricktoulon

XLDnaute Barbatruc
re
de même que ;::
et là pour le coup je peux en faire la démo
sur 2013 32 bit (version disque d'install ce que j'ai chez moi) pas la version (clickandrun(( instalation web)))

que se soit la déclaration vb7 en win64 ou vb 7 en win32 ou vb6 en win 32 la user32 dll chez moi accepte les 3


autrement dit ptrsafe ou pas long (ptr) ou pas
mon 2013 s'en tamponne le coquillard
c'est fou non ?
 

Discussions similaires

Statistiques des forums

Discussions
312 089
Messages
2 085 206
Membres
102 820
dernier inscrit
SIEG68