Appel d'une API Windows en WLangage
Auteur: pat.biker
Date: 2 décembre 2004
Version: 1.0
Revision: aucune
Table des matières
- Introduction
- Documentation sur les APIs
- Connaître le type, FAT32 ou NTFS, d'un disque dur
- La syntaxe en WLangage
- Les paramètres de GetVolumeInformation
- Le test avec WLexplorateur
- Simplification du code avec le NULL
- Exercice
- Liens vers les pages du site
- Liens externes
Introduction
Le WLangage comprend plus de 1000 fonctions, cela peut paraître beaucoup mais le nombre d'API de Windows est encore plus grand. Quand une fonction manque en WLangage, il est presque toujours possible d'utiliser l'API qui va bien. En effet le WLangage dispose de la commande API, qui comme son nom le suggère, permet d'appeler une API Windows.
API ou AppelDLL32
Vous trouverez peut-être sur les forums ou dans des sites dédiés la commande AppelDLL32. Quelle différence avec la commande API ? Aucune, c'est la même fonction. Historiquement dans les premières versions de WinDev, existaient AppelDLL16 pour appeler les APIs 16 bits, et AppelDLL32 pour appeler les DLLs 32 bits. Aujourd'hui, tout est en 32 bits, donc la distinction n'est plus utile. La commande AppelDLL32 a été conservée pour la compatibilité avec les codes existants.
Documentation sur les APIs
Le plus difficile avec les APIs s'est de trouver de la documentation. J'utilise personnellement les deux sources d'information suivantes :
- Le programme WDAPI livré avec WinDev (accessible depuis WDoutils)
- Le site ALLAPI Network où toutes les APIs sont documentées.
Le site ALLAPI Network contient une description détaillée des APIs
Connaître le type, FAT32 ou NTFS, d'un disque dur
Sur le site de ALLAPI, j'ai utilisé la recherche avec "FAT NTFS disk" et cela m'a conduit à l'API GetVolumeInformation.
GetVolumeInformation retourne plusieurs informations sur un disque dur :
- Le nom du volume
- Le numéro de série
- Des flags permettant en autres de savoir si le disque est compressé
- Le type de FAT : FAT32 ou NTFS.
La syntaxe en WLangage
Avant d'appeler l'API, il faut déclarer et souvent initialiser plusieurs paramètres.
Utilisez WDApi
Si vous possédez WinDev, utilisez WDApi pour récupérer le code appelant l'API. C'est ce que j'ai fait, ici. Souvent le code ne fonctionnera pas tel quel car certains paramètres sont à initialiser.
Les paramètres de GetVolumeInformation
Le premier paramètre est le nom du disque, exemple "C:\" ou "C:\D:\". Il n'est pas nécessaire de créer une variable pour ce paramètre. Bien que l'API attende l'adresse d'une chaine, nous pouvons utiliser une chaine littérale (comprendre entre guillemets). Le WLangage réalisera la conversion pour nous. Ce mécanisme ne marche, évidemment que pour les paramètres en entrée. Chaque fois qu'il y a une valeur retournée, il faut passer explicitement l'adresse d'une chaine.
C'est le cas du 2ème paramètre, lpVolumeNameBuffer. Ici l'API attend l'adresse d'une chaine qu'elle ira remplir avec le résultat (le nom du disque dans ce cas). Voici comment il faut procéder :
- déclarer une chaine ASCIIZ
- affecter le paramètre avec l'adresse de cette chaine (opérateur & en WLangage)
sVolumeNameBuffer est une chaîne ASCIIZ sur 255 lpVolumeNameBuffer = &sVolumeNameBuffer
Le 3ème paramètre, c'est la taille de la chaîne, donc ici 255.
Le 4ème paramètre est un entier qui recevra le numéro de série du disque.
lpVolumeSerialNumber est entier
Le 5ème paramètre est un entier qui recevra une info sur un truc où j'ai rien compris (ca arrive souvent dans les APIs, il ne faut pas s'affoler).
Le 6ème paramètre, entier recoit les flags, dont celui de la compression.
Le 7ème, comme le 2ème est une adresse de chaine ASCIIZ, qui recevra le type de FAT.
sFileSystemNameBuffer est chaîne ASCIIZ sur 255 lpFileSystemNameBuffer = &sFileSystemNameBuffer
Le 8ème, comme le 3ème, donne la taille de la chaine.
Le test avec WLexplorateur
Le code suivant permet d'afficher le type de FAT et le nom du volume.
lpVolumeNameBuffer est entier lpVolumeSerialNumber est entier lpMaximumComponentLength est entier lpFileSystemFlags est entier lpFileSystemNameBuffer est entier sFileSystemNameBuffer est chaîne ASCIIZ sur 255 lpFileSystemNameBuffer = &sFileSystemNameBuffer sVolumeNameBuffer est chaîne ASCIIZ sur 255 lpVolumeNameBuffer = &sVolumeNameBuffer Si API("KERNEL32","GetVolumeInformationA","C:\",lpVolumeNameBuffer,255,... lpVolumeSerialNumber,lpMaximumComponentLength,lpFileSystemFlags,... lpFileSystemNameBuffer,255) alors Info(sFileSystemNameBuffer, sVolumeNameBuffer) fin
Découpage des lignes trop longues
En WLangage, il est possible de couper une ligne trop longue. Pour cela, on la termine par 3 points de suspension, comme dans le code ci-dessus.
Simplification du code avec le NULL
Très souvent, un paramètre d'une API pourra être ignoré. C'est le cas ici. Par exemple, si nous ne souhaitons pas récupérer le numéro de série, on pourra remplacer lpVolumeSerialNumber par NULL.
Ce qui nous donne un code simplifié :
sFileSystemNameBuffer est chaîne ASCIIZ sur 255 lpFileSystemNameBuffer est entier = &sFileSystemNameBuffer sVolumeNameBuffer est chaîne ASCIIZ sur 255 lpVolumeNameBuffer est entier = &sVolumeNameBuffer Si API("KERNEL32","GetVolumeInformationA","C:\",lpVolumeNameBuffer,255,... NULL,NULL,NULL,lpFileSystemNameBuffer,255) alors Info(sFileSystemNameBuffer, sVolumeNameBuffer) fin
Exercice
A titre d'exercice, le lecteur courageux pourra essayer d'utiliser l'API GetWindowText. Cette API retourne le texte de la barre de titre.
Cette API possède 3 paramètres :
- hWnd, handle de la fenêtre (fonction WLangage : Handle()).
- lpString, adresse de la chaine où sera copié le texte.
- nMaxCount, taille de cette chaine.
Liens vers les pages du site
- Retour à la page d'accueil
- Présentation du WLangage
- WLexplorateur: l'outil de découverte du WLangage de WinDev
- Aperçu rapide du WLangage de WinDev
- Calculs en WLangage (première partie calculer un biorythme)
- Calculs en WLangage (deuxième partie dessiner un biorythme)
Liens externes
Pour aller plus loin dans l'exploration des APIs ou pour tricher et trouver la réponse à l'exercice.