INTRODUCTION AUX API

Introduction
Structure de la fonction API
Paramètres ByVal ou ByRef
La Visionneuse d'API
Quelle API Utiliser ?
Conclusion

Introduction

Vous avez peut-être déjà remarqué que les fonctions internes de Visual Basic ne vous permettaient pas un accès total au fonctionnalités du système d'exploitation tel que le changement de papier paint du bureau, l'insértion d'icônes dans les menus... Pourtant Windows est livré avec un ensemble de fonctions destinées au programmeur permettant d'executer chacune de ces tâches : cet ensemble de fonctions permettant de controler le système d'exploitation est appelé API (Application Programming Interface, je crois :-).

A travers les API, Windows ouvre grandement ses portes au programmeur. Ces fonctions API sont en fait stockées dans des librairies dlls tels que "kernel32.dll", "user32.dll"... dont la plus part se situent dans le répertoire Windows/System.

Structure de la fonction API

Les fonctions API sont assez proches des fonctions Visual Basic, au fait elles s'utilisent de la même façon que les fonctions Visual Basic aux seules différences que :

Déclaration de la fonction API

Prenons un exemple simple: La fonction SetCursorPos qui position le pointeur de la souris à un endroit précis (ce qui est impossible avec Visual Basic d'ailleurs)

Public Declare Function SetCursorPos Lib "user32" Alias "SetCursorPos"  (ByVal x As Long, ByVal y As Long) As Long

Public définit la portée de la fonction SetCursorPos. Dans ce cas (Public), la fonction peut être appelée n'importe où dans le projet. Si vous remplacez Public par Private la fonction ne sera disponible que dans le module où elle a été déclarée. Notez qu'en même que Public ne peut pas être utilisé dans des modules de Feuille.

Declare Function est utilisé pour indiquer à Visual Basic qu'il s'agit de la déclaration d'une fonction (et non d'une définition/création de fonction).

SetCursorPos spécifie le nom de fonction qui sera utilisé pour appeler cette dernière dans le projet. Vous pouvez spécifier n'importe quel nom pour la fonction (et bien sûr utiliser le même nom pour l'appeler) à condition que ce-dernier respecte les normes d'attribution de nom.

Lib "user32" désigne la librairie (dll) d'où est tirée la fonction. Notez qu'on aurait bien pu mettre Lib "user32.dll" ou Lib "C:\Windows\System\user32.dll", mais on n'a pas besoin ici de spécifier l'extension .dll parce que c'est une librairie Windows. Par contre si la librairie est une dll crée par un programmeur indépendant et qu'elle se trouve par exemple dans le répertoire C:\MesDllAdorées, on devra UNIQUEMENT écrire Lib "C:\MesDllAdorées\MaDLL.dll".

Alias "SetCursorPos" indique le nom de la fonction dans la dll. Et puisque cette dll a été écrite en C++, le nom de cette fonction est case-sensitive c-à-d que Alias "setcurSorPos" est différent de Alias "SetCursorPos": je vous aurai prevenu, faites donc attention.

(ByVal x As Long, ByVal y As Long) spécifie les paramètres nécessaires à la fonction. La manipulation de ces paramètres est la même que celle de fonctions simples. Nous verrons plus loin brièvement l'utilisation de ByVal et de ByRef.

As Long spécifie le type de données renvoyé par la fonction.

Utilisation de la fonction API

L'Utilisation d'une fonction API est la même que celle d'une simple fonction Visual Basic.
Exemple: on utilise l'API déclarée précédement (NOTE: l'API Public a été déclarée dans un module standare) pour bouger le pointeur de la souris.

Private Sub Form_Load()
  ' Fait bouger la souris dans tous les
  ' sens pendant 4 secondes
  Dim CurTime, Diff As Long
  CurTime = Timer
  Do
    SetCursorPos Rnd * 600, Rnd * 400
    Diff = Timer - CurTime
    DoEvents
  Loop While Diff <= 4
End Sub

C'est simple.

Paramètre ByVal ou ByRef

La plupart des fonctions API que vous rencontrerez auront devant leurs paramètres soit un ByVal ou un ByRef... Il est important de savoir quelle est leur signification.

Lorsque vous passez une variable par Valeur (ByVal), comme ici:

Dir VarX, VarY As Long
VarX = 200 : VarY = 100
SetCursorPos ByVal VarX, ByVal VarY

la fonction se contente de prendre le contenu des variables pour effectuer ses traitements, il ne peut pas modifier les variables VarX et VarY.

Lorsque vous passez une variable par Réference (ByRef), comme ici (Qui prend le rectangle de la fenêtre Form1):

Dir rRect As RECT
GetWindowRect ByVal Form1.hwnd, ByRef rRect

la fonction fait le traitement en étant capable de modifier la variable rRect, elle possède une référence de l'allocation mémoire où est stockée rRect donc peut y accéder.

En C++, quand c'est ByVal on parle de contenu de Variable et quand c'est ByRef on parle de pointeur de variable... ne nous éloignons pas trop, le C++ est beaucoup plus complexe que Visual Basic.

Vous comprenez donc rapidement qu'il faut mettre l'oeil sur les fonctions avec des variables passées par référence car la fonction utilise souvent ce type de variable pour renvoyer des données (de type autre que Long en l'occurence) à l'application. Ici, GetWindowRect prend le rectangle de la fenêtre Form1 et le met dans rRect,  on peut ensuite utiliser rRect pour continuer dans le programme.

La Visionneuse d'API

L'environnement de Visual Basic 6 Entreprisel (je sais pas pour les autres versions) intègre une visionneuse d'API qui permet de lister toutes les API de Windows.

Pour la charger allez sur "Compléments/Gestionnaire de complément", puis sélectionnez "Visionneuse D'API" et cocher "Charger" puis cliquez sur OK. Allez de nouveau sur "Compléments/Visionneuse d'API". La visionneuse se charge, cliquez sur "Fichier/Charger le fichier texte" puis sélectionnez le fichier Win32Api.txt ou Mapi.txt.

api1.gif (11213 bytes)

Il vous suffit maintenant de cliquer sur l'API qui vous interesse et vous obtenez se déclaration. Vous pouvez ainsi insérer automatiquement la déclaration dans votre module standare.

Il existe des API qui prennent en paramètres des constantes prédéfinies. Si vous connaissez par exemple le nom de la constante demandée par une API mais que vous ne connaissez pas sa valeur, vous pouvez trouver cette dernière grâce à la Visionneuse d'API. Il suffit de sélectionner "Constantes" dans la liste "Type d'API" et ensuite de sélectionner le nom de la constante. La visionneuse ajoute cette constante avec sa valeur au projet.

Quelle API Utiliser ???

Bon, vous avez la liste des API, mais vous n'avez aucune description, aucune explication de chacune d'elle: c'est là que résulte la véritable difficulté dans l'utilisation des API. Et Malheuresement, l'aide en ligne de Visual Basic ne possède pas de liste explicative de ces API.

Et il y a un autre problème: même si on connaît l'utilité d'une API, il reste encore à savoir quel type de paramètres il faut passer, comment interpreter le résultat obtenu...

Je vous propose quatre solutions qui sont tous liées au C++:

Conclusion

FONCTIONNEMENT
Comme nous l'avons vu, les API sont simples d'utilisation mais c'est le manque d'informations sur ces-dernières qui cause problème.
Soyez tout de même prudent lorsque vous travaillez avec les API, une mauvaise opération peut faire planter le système ou détruire des fi

CE QU'ON PEUT FAIRE AVEC LES API
Avec les API vous pouvez changer les icônes de bureau, cacher la barre des tâches, jouer des video .avi, jouer des sons .wav, créer des écrans de veille, ordonner l'arrêt du système, cacher le pointeur de la souris, comander (réduire, agrandir, fermer..) les fenêtres d'autres applications, changer le bouton Démarrer, bref devenir maître du système... pensez à toutes les vilaines choses que vous pourriez faire (je m'adresse aux hackers).

TOUJOURS PLUS...
Pour mieux manipuler les API, il convient de savoir ce que c'est qu'un Handle de Fenêtre hWnd (la grande majorité d'API l'utilise), et aussi savoir ce que c'est qu'un Device Context Handle hDC: C'est l'objet du prochain article.

[Home] lienie.gif (941 octets)[Actualités]  [Trucs & Astuces] [Astuces Windows] [ActiveX-Ocx/Dll] [Articles] [Codes Sources] [VB Games] [Fichiers Sons] [Fichiers Icônes] [Programmes & Sources]  mailing.gif (910 octets)[Mailing-List] smiley.gif (359 octets)[Divers] about.gif (920 octets)[A Propos]