Ecrire une DLL en C/C++
Buhl Damien
alias daminetreg
http://lecbna.com/
http://www.gamemaker.fr/

GameMaker 6 et +
Enregistré



Sites & Tutoriels Utiles:
1.) http://www.siteduzero.com/
2.) http://casteyde.christian.free.fr/cpp/cours/index.html
3.) http://www.developpez.com/c/cours/

Tutoriel préalablement écrit par roach puis sous sa demande traduit par daminetreg : « Je vous promet de faire quelque chose de plus concret la prochaine fois. :p »

Légende:
Sprites
Sounds
Background
Paths
Scripts
Fonts
Timelines
Objects
Rooms

Groupe

Event
Action

§Point étape
!Information importante

Bonjour, dans ce tutoriel nous allons apprendre à écrire une DLL en C++, le plus commun des langages justement pour les dlls! Les pré requis sont donc Dev-C++ et quelques connaissances en C++, bien qu’elles ne soit pas nécessaire à la bonne réalisation de notre DLL, elles sont nécessaires pour la partie C++, quoique avec un peu de bon sens les deux trois lignes que nous écrirons ne serons pas compliquées à comprendre.

Bien maintenant entrez dans le répertoire de Dev-C++, créez un sous répertoire « Projets » s’il n’existe pas déjà. Puis créez un autre répertoire nommé : « TestDLL » dans le répertoire « Projets ». Maintenant exécutez Dev-C++, puis cliquez sur : File > New > Project. Cliquez sur l’icône DLL une fois, comme nom de projet entrez : “Test” et vérifiez que la checkbox C++ est bien sélectionnée. Le logiciel vous demandera de le sauvegarder quelque part, sauver le dans le répertoire « TestDLL » que nous avons créé plus avant.

Désormais vous avez deux fichiers dans votre projet, le fichier d’en tête et le fichier principal de la DLL.

Tout d’abords nous devons définir plusieurs paramètres pour notre DLL, ouvrez le répertoire « Test » dans la fenêtre d’exploration à gauche de votre écran et cliquez sur : « dll.h ». Sous la ligne
#define _DLL_H_
, collez ce code :

/* Début de la définition de l’utilisateur */
#define export extern "C" __declspec (dllexport)
/* fin de la définition de l’utilisateur */

Ce code défini la fonction export de la DLL. C’est à utiliser en début de chaque fonction que vous voudrez utiliser dans vos DLL, et celle-ci permet… d’exporter! Vous êtes libre de changer export par quoi que ce soit, du moment que ça vous plaise.

Lorsque vous serez arrivé là, dirigez vous dans le fichier : dllmain.cpp. Supprimer tout ce qui est sous la ligne #include <windows.h>, mais surtout pas celle-ci, en dessous, pas dessus ni haut dessus. Mis à part le commentaire. Pressez sur entrée quelque fois afin de vous donner un peu d’espace, et lorsque vous aurez assez d’espace pour respirer, ou plutôt coder votre première fonction il faudra y aller. Ce sera quelque chose de simple, nous ne sommes pas ici pour apprendre le C++ mais bel et bien le Gml, nous choisirons simplement une fonction permettant d’additionner deux nombre. Collez ce code ci:

export double add(double number1, double number2)
{
      return(double)number1+number2;
}

! Bien, vous vous sentez mieux désormais ? Nous allons donc essayer de comprendre ce petit brin de code… notez le export qui est le même que nous avons défini plus tôt dans le fichier d’en tête. Notez aussi qu’il est nécessaire qu’après chaque ligne d’une fonction il doit y avoir un point virgule : « ; ». Vous pouvez aussi voir que nous usons return, que nous avons réglé sur le type : double. Ce qui signifie qu’en additionnant number1 et number2 il retourne une valeur de type : double. Qui le sont chacune d’ailleurs, pour ce qui est des types de valeurs référez vous à d’autres tutoriels sur le C/C++.

Votre fichier : dllmain.cpp doit ressembler à quelque chose comme cela :

#include "dll.h"
#include <windows.h>

export double add(double number1, double number2)
{
      return(double)number1+number2;
}

Sauvegardez les deux fichiers, sous leur nom par défaut. Et cliquez sur : Execute > Compile, et laissez le compilateur s’amuser, lorsqu’il dira : « done », vous pourrez sortir du programme.

Bien jusque là ce n’était rien d’exceptionnel, ni de difficile, et bien devinez ! Ce ne sera rien de difficile et d’exceptionnel non plus ! Nous allons appeler notre DLL à partir de GameMaker, et dans cette optique créer un nouveau script.
Ce script initialisera la DLL, collez le code suivant :

/* Ce code va initialiser la fonction de la DLL que vous venez de créer.
Cela définit quel est le nom de la DLL, le surnom de la fonction, on parlera d’alias, le type d’appel, le type de ressource, et les arguments. Nous avons deux arguments, tout deux : « real » qui signifient numériques, le type de ressource est donc les réels, car la fonction de notre DLL retourne une valeur numérique. */

global.defTestDLL_Ajout=external_define("Test.dll","add",dll_stdcall,ty_real,2,ty_real,ty_real);

Comme vous pouvez le voir, cela définit la fonction du script qu’il est en train d’initialiser: « add ». Nommez le script TestDLL_Initialisation pour rester dans les grands classiques de toutes les dlls.
Maintenant créez un autre script, nommez le TestDLL_Ajout. Sur ces lignes collez le code suivant :

//Arguments
//argument0 - number1
//argument1 - number2
///////////////////
external_call(global.defTestDLL_Ajout,argument0,argument1);

Maintenant notez comment nous avons appelé la variable que nous avions préalablement définie telle l’allias de la fonction dans le premier script. Il y a deux arguments, comme défini dans le premier script.
Créez désormais un objet, puis dans l’événement Create appelez le script d’initialisation. Puis dans « Key Release » sélectionnez Space et ajoutez y la Piece of Code suivante en tant qu’action.

n1=get_integer("Entrez le premier nombre:",0);
n2=get_integer("Entrez le second nombre:",0);
reply=TestDLL_Ajout(n1,n2);
show_message(string(n1)+"+"+string(n2)+"="+string(reply));

! Comme vous pouvez le voir dans ce script number1 et number2 sont définis par les arguments qui eux-mêmes sont définis par n1 et n2. La DLL retourne ensuite la réponse de l’addition : « reply ». Sauvegardez cela mettez l’objet dans une room, sauvegardez le jeu dans le répertoire de notre DLL et faites tourner, puis pressez espace lorsque le jeu sera chargé. Bravo! Vous venez de faire une DLL inutile au sens pratique ! Mais tout à fait utile pour vos connaissances. J’espère avoir été assez clair dans mes explications. Au cas où voici les fichiers source: Cliquez ici.

Bonne Chance pour tout vos projets...
Buhl Damien
alias daminetreg