Cours pdf les API en Visual Basic, tutoriel & guide de travaux pratiques en pdf.
L’appel de la fonction
Une fois déclarées, ces fonctions s’utilisent comme des fonctions Visual Basic.
La documentation
C’est le défaut principal des API. Il existe des sites Internet bien fait qui traitent de ce sujet. Mais principalement, on trouve sur le site Microsoft un fichier Win32.hlp qui contient toute l’aide de programmation des API. Ils a été écrit pour les développeurs C++, mais si les concepts exposés ci-dessus ont été saisis, la traduction est très simple. Pour ma part je me sers principalement de ce fichier (et de l’aide du SDK), ainsi que du tableau « Conversion en Visual Basic de déclarations en langage C » du MSDN.
Enfin des exemples
Comme nous voilà farci de théorie, nous allons maintenant parcourir un certain nombre d’exemples, pour regarder de plus près tous ces concepts.
La plus simple des API est une procédure qui attend un paramètre. Elle sert à stopper l’exécution du thread courant pendant n millisecondes
Private Declare Sub Sleep Lib « kernel32 » Alias « Sleep » (ByVal dwMilliseconds As Long)
Il est à noter que c’est une procédure et non une fonction ce qui est assez rare.
Dans le code, pour faire une pause de 300 millisecondes :
Sleep 30
Pour continuer dans les procédures nous allons regarder un cas beaucoup plus intéressant, la procédure GetSystemInfo. Cet exemple va nous permettre de bien saisir le passage par référence.
Dans ma visionneuse je cherche ma fonction, et je trouve :
Private Declare Sub GetSystemInfo Lib « kernel32 » Alias « GetSystemInfo » (lpSystemInfo As SYSTEM_INFO)
Là, je passe donc un paramètre de type SYSTEM_INFO. Comme je ne connais pas ce type, je le cherche dans les types de la visionneuse et j’obtiens :
- Private Type SYSTEM_INFO
- dwOemID As Long
- dwPageSize As Long
- lpMinimumApplicationAddress As Long
- lpMaximumApplicationAddress As Long
- dwActiveProcessorMask As Long
- dwNumberOrfProcessors As Long
- dwProcessorType As Long
- dwAllocationGranularity As Long
- dwReserved As Long
- End Type
L’appel dans le code est le suivant :
- Dim RecupInfo as SYSTEM_INFO
- GetSystemInfo RecupInfo
- Debug.print RecupInfo. DwProcessorType
Comme on le voit, il s’agit d’une procédure, et pourtant maintenant ma variable RecupInfo contient l’ensemble des valeurs désirées. Cela est dû au passage par référence qui permet à la fonction de modifier la variable. Regardons maintenant le passage d’une chaîne. La fonction GetUserNameA renvoie le nom de l’utilisateur.
Dans la visionneuse on voit qu’il y aussi une fonction GetUserNameW. Le A en fin de chaîne signifie ANSI, le W unicode. Comme VB fait la conversion en ANSI automatiquement, nous utiliserons les fonctions A. Donc, Private Declare Function GetUserName Lib « advapi32.dll » Alias « GetUserNameA » (ByVal lpBuffer As String, nSize As Long) As Long Comme nous l’avons vu précédemment, la chaîne est bien passée par valeur, elle va pourtant être modifiée. La fonction s’utilise ainsi
- Dim strTampon As String, Taille As Long, Retour as Long, UserName as String
- strTampon = Space$(255)
- Taille = 256
- Retour= GetUserName(strTampon, Taille)
- UserName=Left$( strTampon,Taille-1) ou
UserName = Mid$( strTampon, 1, InStr(1, strTampon, Chr$(0)) – 1) Comme vous le voyez, j’ai dimensionné ma chaîne au préalable. La variable Retour contiendra 0 si la fonction a échoué). Je vous donne en fin de fonction deux façons de récupérer la partie de la chaîne qui nous intéresse.
Se méfier de la visionneuse
Nous allons prendre un exemple un peu plus compliqué. Je vais utiliser la fonction Polygon qui permet de tracer un polygone sur un objet possédant un contexte de périphérique (hdc). Je vais donc dans la visionneuse API et je récupère :
Private Declare Function Polygon Lib « gdi32 » Alias « Polygon » (ByVal hdc As Long, lpPoint As POINTAPI, ByVal nCount As Long) As Long
Je vais aussi récupérer le type POINTAPI.
- Private Type POINTAPI
- x As Long
- y As Long
- End Type
Donc si je regarde mon code, je vois que la structure POINTAPI contient les coordonnées d’un point. Mais si je regarde la fonction, je suis en droit de me demander comment on trace un polygone avec un point. Si par curiosité je vais voir dans mon fichier win32.hlp la même fonction.