Rappel : Ce cours est enseigné dans la
spécialité PISE du Master MECI (Université Paris 7)
par Christophe Darmangeat

Partie 11
Attaquer (sauvagement)
les tréfonds de Windows :
dll, api, ocx... et sos !
Gare à la casse et sus à la migraine ! Dans cette rapide présentation, on va voir quelques (je dis bien quelques) éléments permettant d’aller plus loin avec VB. En fait, on va voir comment VB peut (mais ce n’est pas obligé) utiliser des éléments de Windows pour améliorer ses (vos) performances. Mais là, inutile de préciser qu’entrant de plain-pied dans le domaine ésotérique de l’architecture de Windows, on n’est pas au bout de nos peines.
1. Le rôle des DLL
Vous savez sans doute (ne serait-ce que pour avoir supprimé un jour par mégarde) que ces fameuses DLL jouent un rôle capital dans Windows. Mais que se cache-t-il derrière cet acronyme byzantin ? Eh bien, ce sont des "bibliothèques de liens dynamiques", autrement dit des Dynamic Link Libraries. Ces DLL contiennent du code compilé (donc illisible) exécutant telles ou telles fonctions dans Windows.
Par exemple, vous avez déjà remarqué que dans Windows, certaines boîtes de dialogue ont une tête standard, toujours la même quelle que soit l'application : Fichier – Ouvrir, Fichier - Enregistrer, Fichier – Imprimer, Format - Police, et quelques autres encore. Ce n'est pas un hasard : ces boîtes sont en quelques sorte préprogrammées, et n’importe quel programmeur (dont vous-mêmes, public adoré), au lieu de se fader de les reproduire avec plus ou moins de bonheur, peut se contenter d’y faire appel.
En fait, quel que soit le logiciel de départ, lorsqu'on déclenche par exemple la commande Fichier - Imprimer, c'est toujours le même morceau de code externe à ce logiciel qui s'exécute .
Pour continuer avec notre exemple, Comdlg32.dll est le doux nom de la DLL qui contient ce code nécessaire à l’exécution de boîtes de dialogue communes (d’où son titre, abréviation de "Common Dialog") aux applications Windows qui veulent s’en servir.
Donc, lorsque Word ou Excel vous proposent ces boîtes de dialogue, il faut comprendre que les lignes de code correspondantes ne font pas à proprement partie de Word ou Excel. Ces lignes de code sont stockées (une seule fois, donc) dans cette DLL. Word et Excel, eux, se contentent d’appeler la DLL, autrement dit le code qu’elle contient.
Il en va de même pour toutes les DLL, qui sont donc des morceaux de programme utilisables par d’autres programmes. Cela signifie que lorsque vous écrivez du VB, vous n’êtes pas obligé de réinventer à chaque fois l’eau tiède, la poudre à maquiller et le fil à couper le roquefort. Si une DLL contient déjà le code qui fait ce que vous souhaitez, vous pouvez (c’est même recommandé) appeler cette DLL plutôt que réécrire – généralement, moins bien – le code en question en VB.
Avec VB, vous pouvez donc :
  • utiliser du code déjà présent dans Windows via une DLL
  • et même, créer de surcroît vos propres DLL (mais, là, attention les yeux, ça dépasse nettement les objectifs de ce cours.)
Vous l'aurez compris, on se contentera du premier point (quoique le second ne soit pas si inabordable que cela).
Alors, au fait, pourquoi « lien dynamique » ? C’est une question d’architecture. Un langage qui fonctionne avec des liens statiques incorpore à l’exécutable absolument tous les éléments de code dont il a besoin (cf. ce qu’on a dit, par exemple,  pour le chargement des fichiers dans un contrôle image). Avantage, l’exécutable est autonome, et portable tel quel sur n’importe quel machine. Inconvénient, l’exécutable en question a tendance a être gros. L’avantage des langages et des systèmes fonctionnant avec des liens dynamiques, c’est que le code souvent utilisé est en quelque sorte partagé entre tous les exécutables qui en ont besoin à un moment où à un autre.
Avantage : s’il y a plein d’exécutables, on finit par y gagner en place occupée sur l’ordinateur. Inconvénient, l’exécutable généré par un tel langage ne fonctionnera que s’il trouve présentes sur la machine toutes les DLL dont il a besoin. C’est précisément un des aspects cruciaux dont s’occupe l’assistant d’installation de Visual Basic.
En fait, avec cette histoire de DLL, on retrouve peu ou prou à un autre niveau la division entre « logiciel d’application » et « système d’exploitation »  qui existe depuis si longtemps en informatique. Mais là, la zone d’influence du « système d’exploitation », disons plutôt de Windows, dépasse largement la gestion du disque dur et de l’écran. Les DLL contiennent du code gérant (liste non exhaustive) : l’interface graphique, les capacités multimédia…


2. Deux voies vers le bonheur suprême
VB offre en fait deux possibilités pour appeler le code contenu dans les DLL de Windows. Si l'une d'elle vous est encore inconnue, l'autre est en réalité une vieille connaissance… car tels M. Jourdain, vous n'avez jusqu’à maintenant fait qu'appeler des DLL sans le savoir.
2.1 Les appels de l'API
Commençons par le plus barbare, le plus brutal et le plus sanguinaire. Aïe, Aïe, Aïe, que se cache-t-il derrière API, ce joli nom de pomme rouge ? Comme vous vous en doutez, comme à chaque fois que Microsoft est dans le secteur, ze worm is in ze frout.
API signifie : Application Programming Interface. C’est en fait un habillage de toutes les fonctions disponibles au sein des DLL. Mais on verra qu'en fait d'habillage, cela ressemble davantage à des haillons qu'à autre chose…
L'idée générale de l'API, c'est que toute DLL peut être utilisée par un langage comme VB sous forme de fonction, qui utilise donc les paramètres (arguments) qu'on lui fournit et qui renvoie donc un résultat vers le langage. Donc, en théorie, pour utiliser une DLL, il suffit de savoir laquelle effectue le traitement que l'on souhaite, quels arguments il faut lui envoyer, et quel type de valeur elle retourne. Ensuite, il ne reste plus qu'à créer cette fonction dans le programme. Mais... il y a un mais. Et pas qu'un seul !
Première bonne blague : à part d’épais et indigestes bouquins (en plus, ils sont chers), il n’existe nulle part une liste un peu complète des fonctions d’appel de l’API, vous disant  quelle fonction fait quoi, et la syntaxe de l’appel. Donc, en gros, ça existe, mais Microsoft ne vous dit pas ni où ni comment. Résultat, il faut chercher, chercher, et chercher encore, crier au secours sur Internet, pour savoir quel appel API utiliser pour une tâche donnée, et en connaître la syntaxe. Il n'y a pas si longtemps, j’ai vu un étudiant passer plusieurs heures à chercher comment, par un code VB, lancer Access avec une base de données précise chargée à l’ouverture… Ce n’est pourtant pas sorcier, me direz-vous ? Pourtant, il n’a obtenu une réponse valable que juste avant de mourir d’épuisement et de désespoir.
Mais jetons un voile pudique sur les affres de cette quête, et imaginons que vous ayez enfin trouvé la syntaxe de l’appel API de vos rêves les plus fous. Comment le mettre en œuvre dans votre application ?
En ce qui concerne la syntaxe, un appel API ne se distingue pas fondamentalement d’un appel à une fonction ordinaire, avec des paramètres.
Pour pouvoir utiliser de l’API (autrement dit une DLL), il faut tout d’abord déclarer la fonction en question, en indiquant les éléments suivants :
  • le nom de la procédure ou fonction
  • le fichier DLL dans lequel elle se trouve
  • les paramètres qu’elle doit recevoir
  • le type de valeur renvoyée, s’il s’agit d’une fonction
Tout cela, encore une fois, vous ne l’inventez pas. Il vous faut tous ces renseignements pour pouvoir travailler, renseignements recueillis dans un bouquin, sur le Net, ou auprès d’un ami si vous avez de mauvaises fréquentations.
Au total, la déclaration donnera un splendide zorglub du genre :
Private Declare Function Duchemol Lib "Coucou32" Alias "Zigopaf" (Byval x As Long, Byval y As Long) As Long
Hem. Je sens qu'un petit décodage ne sera pas inutile.
  • Declare indique qu'il s'agit d'une déclaration API
  • Duchemol est le nom que vous choisissez pour votre fonction
  • Lib indique qu'il va falloir aller piocher dans une DLL…
  • …DLL dont le nom est Coucou32
  • Alias "Zigopaf" est un paramètre éventuel, souvent omis par VB car le nom d'alias est le même que le nom de la DLL
  • X et Y sont les paramètres envoyés à la fonction, avec leur type
  • le "As Long" final indique le type de valeur retournée par la fonction.
  • Ouf.
Une fois cette fonction d’appel API déclarée, vous pourrez vous en servir comme de n’importe quelle fonction, avec par exemple en cours de programme :
Toto = Duchemol(45, 156)
Et voilà. Finalement, c'est simple, non ?
2.2 Les contrôles
Heureusement, ce qui sauve le programmeur VB (sans parfois qu'il le sache), c'est qu'à chaque fois qu'on appelle des DLL, on n'est pas systématiquement obligé de passer par l'API. Il existe une autre voie, bien plus facile. Cette voie, ce sont les... contrôles !
Mais oui ! Les contrôles ne sont que des programmes qui servent d'intermédiaire entre le développeur et les DLL de Windows, intermédiaire qui se charge de traduire la discussion en la rendant nettement plus accessible.
Quand on y réfléchit un peu, tout ça se tient parfaitement. Depuis le début de ce cours, qu'avons nous fait ? Nous avons employé des boutons, des cases à cocher, des listes, etc. autrement dit des éléments de Windows>. Cela signifie que les boutons, les cases à cocher, et tutti quanti existent dans Windows sous forme de DLL. Ce sont ces DLL que nos logiciels classiques (Word, Excel ou Photoshop) utilisent en permanence. Et ce sont ces mêmes DLL que nous avons pu utiliser nous aussi pour écrire nos propres applications.
Simplement, nous n'avons pas eu à programmer d'appels API lorsque nous avions besoin de tout cela (on s'en serait rendu compte !). Pourquoi ? Parce que d'autres programmeurs, en l'occurrence les auteurs du langage  Visual Basic, ont écrit avant nous de petits programmes nous présentant ces DLL sous forme d'objets réutilisables, avec leurs propriétés et leurs méthodes.
Dès lors, cela signifie que si l'on a besoin d'un élément de Windows, il faut toujours chercher à passer par un contrôle, et ne se résoudre à passer par l'API qu'en dernier recours, si on n'a trouvé aucun contrôle qui effectue la tâche voulue.
On peut classer les contrôles VB en quatre  catégories :
  • un certain nombre de contrôles sont fournis en standard avec VB. Ce sont ceux que nous avons explorés tout au long de ce cours. Même si nous en avons laissé un ou deux de côté, ces contrôles ne devraient à l'heure actuelle plus avoir guère de secrets pour vous...
  • d'autres contrôles se tiennent en réserve dans VB, prêts à être exploités (par exemple, pour gérer des fonctions multimédia). Pour les utiliser, il faut aller les charger par le menu Projet – Composants. Malheureusement, l'aide disponible sur ces contrôles n'est pas toujours très prolixe, pour dire le moins… Concrètement, on ne peut utiliser ces contrôles que muni d'une documentation qui n'existe que dans certains ouvrages spécialisés.
  • il existe une autre possibilité : des programmeurs, qui mettent des contrôles supplémentaires à votre disposition sur le Net, à titre plus ou moins gracieux. Ces contrôles sont souvent très utiles, et sont un excellent moyen pour ne pas avoir à réinventer quelque chose qui l'a déjà été. Ils se présentent toujours sous la forme de fichiers *.ocx. Il suffit de les télécharger - si possible dans le bon répertoire, celui qui contient déjà tous les autres fichiers *.ocx -, et de les activer dans VB via la même manœuvre que précédemment. Dans ce cas, la documentation est de qualité variable. Au pire, le contrôle est livré seul, sans explication, ce qui promet généralement de longues heures de tâtonnement pour comprendre le fonctionnement de ses propriétés. Au mieux (et ce n'est pas rare), le développeur vous fournit un fichier d'aide détaillant propriétés et méthodes, ainsi qu'un exemple d'utilisation. Dans ce cas, la vie est merveilleusement belle.
  • enfin, un programmeur averti sera capable de créer lui-même des contrôles. Mais cela sort quelque peu des modestes  ambitions de notre propos. Sachez toutefois que cela n'a rien d'insurmontable.
A signaler que si votre application emploie des contrôles non standard, vous devez veiller, tout comme pour des fichiers images, à ce que l'installateur repère ces contrôles et les écrive dans le bon répertoire des machines sur lesquelles votre application sera distribuée.
Je termine cette partie par un exemple qui en vaut un autre, celui du contrôle qui gère les DLL des boîtes de dialogue communes (Fichier-Ouvrir, Fichier-Imprimer, etc.) : le contrôle Comdlg32.ocx
Celui-ci permet d’utiliser la DLL correspondante, dont on a parlé plus haut (comdlg32.dll). Grâce à ce contrôle, on disposera donc des menus Fichier - Ouvrir, Fichier - Enregistrer, etc., sans - presque - avoir à rien faire.
Avant toute chose, il faut bien sûr commencer par charger le contrôle comdlg32.ocx dans VB, car ce contrôle, par défaut, ne vous est pas proposé. Rappel : pour ce faire, il faut passer par la commande Projet – Composants, et le choisir dans la liste.
Ensuite, l’astuce, c’est qu’avec ce seul contrôle, on peut ouvrir six boîtes de dialogues différentes. Pour ce faire, il suffit d’appliquer à ce contrôle la méthode appropriée :
 
Boîte de dialogue
Méthode à utiliser
Fichier - Ouvrir
ShowOpen
Fichier - Enregistrer
ShowSave
Couleur
ShowColor
Police
ShowFont
Imprimer
ShowPrinter
Aide
ShowHelp

Avant de lancer telle ou telle méthode pour ouvrir la boîte de dialogue correspondante, il conviendra d'ajuster les propriétés du contrôle, afin de préciser éventuellement des filtres (pour Fichier - Ouvrir), un titre pour votre boîte, etc. De même, la réponse de l’utilisateur sera stockée, comme d’habitude, dans une autre propriété du contrôle. On a ainsi, entre autres, pour la boîte de dialogue Fichier - Ouvrir :
  • FileName : qui récupère le nom complet (avec le chemin) du fichier sélectionné par l’utilisateur
  • FileTitle : qui récupère le nom du fichier sélectionné par l’utilisateur sans le chemin
  • Filter : qui définit le(s) type(s) de fichiers proposés par votre boîte de dialogue
  • FilterIndex : qui définit lequel des filtres doit être utilisé
  • InitDir : qui fixe le répertoire initial
  • DialogTitle : qui donne titre de la boîte de dialogue
  • etc.
Pour les propriétés des autres boîtes de dialogue communes, cf. les bouquins ou le Net !
L'affichage d'un Gif animé, la lecture d'un fichier mp3 et la gestion des liens hypertexte sont des tâches qui ne sont assumées par aucun contrôle standard de Visual Basic. Mais pour chacune d'elle, des contrôles gratuits existent... quelque part ! Effectuez la recherche sur le Net, trouvez des contrôles adéquats et programmez-les. Vous ne trouverez pas forcément les mêmes que ceux dont les corrigés donnent la référence ; peu importe, seul le résultat compte !
Afin de pouvoir lancer les exécutables, un fichier est à chaque fois nécessaire, fichier qui devra être téléchargé dans le même répertoire que l'exécutable.
Nom de l'exercice
Exécutable
Fichier
Sources
Gifle à Minet
Rigolos de Minuit