SUPINFO International University

SUPINFO Institute of Information Technology
Laboratoire Microsoft




Tous les Articles du Laboratoire Microsoft

Microsoft vous invite au concert d'Alanis Morissette !
Accueil > Articles > Actualité
Auteurs 
Yann ALET
LABORATOIRE SUPINFO DES TECHNOLOGIES MICROSOFT
Formateur


 Tous les articles de cet auteur

3,1/5

Assez Bien


59147
69/218

Un exemple concret

Ecrivons notre première Dll

Commençons par développer un premier programme... ou plutôt devrions nous dire une première fonction, car une Dll ne fait qu'exporter des fonctions, rappelons-le. Reprenons notre projet vide.

Voici une première fonction toute simple que nous pourrions concevoir, elle écrit une phrase dans un fichier :

#include "dll_fichier.h"

int Ecrire(void)
{
  // Déclaration et initialisation d'un buffer contenant la chaine à écrire
  char chaine[] = "Hello, world !\n";
  // déclaration d'un pointeur sur fichier
  FILE* fichier;
  // ouverture du fichier en mode "append" (ajout)
  fichier = fopen("./sortie.txt","a");
  // écriture de la phrase
  fwrite((void*)chaine,1,strlen(chaine),fichier);
  // fermeture du fichier
  fclose(fichier);
  // renvoie 0 = pas d'erreur
  return 0;
}

Ajoutons également le .h correspondant à notre projet, dans la section header files :

#include <stdio.h>
#include <string.h>
int Ecrire(void);

Nous ne nous attarderons pas sur la gestion d'erreurs, afin de ne pas surcharger le code.
Compilez la Dll, il ne devrait pas y avoir de problème.

Mais comment réutiliser ce code ??? Vous vous souvenez de l'outil Quick View Plus, que j'ai cité plus haut ? Il va commencer à nous être utile ici... Observez la Dll compilée avec cet outil... et vous remarquerez qu'aucune fonction n'est exportée !!! Que se passe-t-il ?
La fonction que nous venons de créer n'a simplement pas été déclarée comme fonction à exporter.

Pour déclarer une fonction comme exportable, il faut utiliser __declspec(dllexport), afin de spécifier au compilateur que la fonction doit être exportée. Il faut également signaler que cette fonction utilise une convention d'appel standard (tout comme VB), par l'utilisation de __stdcall.
Modifions notre .h pour obtenir ceci :

#include <stdio.h>
#include <string.h>

#define EXPORT __declspec(dllexport) // définit la macro EXPORT

EXPORT int __stdcall Ecrire(void); // spécifie que cette fonction est à exporter

Modifions également le fichier .cpp pour intégrer le __stdcall entre le type de retour et le nom de la fonction.

Recompilons la Dll, et observons la avec Quick View Plus...
Vous devriez apercevoir quelque chose qui s'apparente à ceci :

Export Table
Name: dll_fichier.dll
Characteristics: 00000000
Time Date Stamp: 3c939168
Version: 0.00
Base: 00000001
Number of Functions: 00000001
Number of Names: 00000001

Ordinal Entry Point Name
0000 0000100a ?Ecrire@@YGHXZ

Nous remarquons la présence de notre fonction exportée ! Cependant, elle a un nom étrange... En fait, le nom exporté est généré dynamiquement par le compilateur (il s'agit d'un "decorated name", nom décoré), qui lui ajoute des lettres variables en fonction du type et du nombre d'arguments qu'accepte la fonction... Mais ne serait-il pas possible d'avoir un nom un peu plus correct ?????

Si, bien sûr... C'est la qu'intervient le fichier d'exportation... Il s'agit d'un fichier à l'extension .def, qu'il faut ajouter au projet... Créez donc le fichier , et ajouter lui ceci :

LIBRARY   dll_fichier
DESCRIPTION "Une premiere Dll"
EXPORTS
  Ecrire   =   ?Ecrire@@YGHXZ                 PRIVATE

Vous spécifiez dans ce fichier le nom de la Dll, une courte description, ainsi que le véritable nom exporté de la fonction. Vous devez pour ceci connaître son nom interne, que lui a donné le compilateur.

Retirez par la même occasion le EXPORT devant la déclaration de la fonction dans le fichier .h, il ne sera plus d'aucune utilité maintenant... Compilez la dll... Et retournez lire sa table d'exportation avec Quick View Plus.

Vous devriez lire quelque chose comme ceci :

Export Table
Name: dll_fichier.dll
Characteristics: 00000000
Time Date Stamp: 3c939566
Version: 0.00
Base: 00000001
Number of Functions: 00000001
Number of Names: 00000001

Ordinal Entry Point Name
0000 0000100a Ecrire

Victoire ! Vous avez compilé votre première Dll !!! Voyons maintenant comment l'utiliser...

Utilisation de notre Dll

Essayons d'utiliser notre Dll sous Visual Basic...
Créez un nouveau projet Visual Basic, un .exe standard.
Ajoutez un module au projet, et déclarez-y la fonction de notre Dll, comme ceci :

Public Declare Function DllEcrire Lib "dll_fichier.dll" Alias "Ecrire" () As Long
'Déclare la fonction DllEcrire, nom qui sera utilisé sous VB
'comme fonction appartenant à la dll dll_fichier.dll
'et dont la fonction exportée est Ecrire, qui ne prend pas d'arguments
'et retourne un Long

Ceci va vous permettre d'utiliser le fonction sous VB !

Attention, vous remarquez que la fonction retourne un entier en C++, mais elle retournera un Long en VB, car le long VB est codé sur 4 octets. Faites bien attention aux types retournés ou passés en paramètre, car il n'ont souvent pas la même taille sous Visual Basic et sous Visual C++.

Enfin, ajoutez un bouton 'Command1', par exemple, et tapez le code suivant dans votre feuille :

Private Sub Command1_Click()
Dim retour As Long 'code de retour de la fonction de la Dll
retour = DllEcrire() 'appel de la fonction de la Dll
End Sub

La fonction sera appelée lors du clic du bouton.

Lorsqu'un programme fait appel à une Dll, il va voir dans le répertoire %systemroot%\system32. Copiez donc votre Dll compilée dans ce répertoire.
Ceci fait, compilez le programme VB et testez-le... Vous devriez voir apparaître un fichier sortie.txt contenant le message écrit !
Vous connaissez donc désormais le fonctionnement principal des Dlls... Abordons quelques notions un peu plus avancées...


Sommaire
1 - Introduction
2 - Dlls for dummies
3 - Première approche
4 - Un exemple concret
5 - Un peu plus loin...
6 - Conclusion


En Savoir Plus 
Evaluez cet article 


Pour afficher ou poster un commentaire, cliquez sur ce lien : Forum-Microsoft



Retrouvez ci-dessous les autres sections du Laboratoire Microsoft