pictogram Auteur: pat.biker
Date: 2 décembre 2004
Version: 1.0
Revision: aucune

Table des matières

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 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.

 Copie d'écran d'une recherche sous Google

GetVolumeInformation retourne plusieurs informations sur un disque dur :

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 :

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.

 Résultat affiché dans WLexplorateur

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 :

Liens vers les pages du site

Liens externes

Pour aller plus loin dans l'exploration des APIs ou pour tricher et trouver la réponse à l'exercice.