Créer une dll en C avec Code::Blocks

cs_seb5 Messages postés 2 Date d'inscription mardi 1 août 2006 Statut Membre Dernière intervention 7 août 2006 - 5 août 2006 à 17:19
cs_seb5 Messages postés 2 Date d'inscription mardi 1 août 2006 Statut Membre Dernière intervention 7 août 2006 - 7 août 2006 à 22:05
Salut à tous,
Je souhaite placer certaines de mes fonctions dans une dll pour pouvoir les réutilisé dans plusieurs programmes. Je programme en C sous Windows XP SP2.
Donc dans Code::Blocks je crée un nouveau projet dll. Je place mes fonctions dans le fichier main.c de ce projet:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#ifdef BUILD_DLL
    #define DLL_EXPORT __declspec(dllexport)
#else
    #define DLL_EXPORT
#endif

void affiche() {
    printf("Hello world");
}

int calcule(int a, int b) {
    int m = a+b;
    return m;
}

Je crée un fichier madll.def  contenant:

LIBRARY madll   ;Nom de la DLL
CODE PRELOAD OVEABLE DISCARDABLE
DATA PRELOAD SINGLE
EXPORTS
   affiche   ;Nom des fonctions de la DLL
   calcule   ;Nom des fonctions de la DLL

Donc je compile ce projet, pas de problème. Ca me crée aussi un .a mais je ne pense pas en avoir besoin puisque je veux une librairie dynamique et non statique.
Ensuite pour utiliser la dll je vais dans le projet de mon programme. Dans mon main.c je met:

int main() {
HINSTANCE DLLHandle;
typedef char (*PointeurFonctionType)();
PointeurFonctionType PointeurFonction;

DLLHandle = LoadLibrary("madll.DLL");
PointeurFonction = (PointeurFonctionType)GetProcAddress(DLLHandle,"affiche");
PointeurFonction();
return 0
}

Et donc là la console devrait afficher un jolie "Hello world", mais non. A la place j'ai l'horrible fenêtre de windows ma demandant si je veux envoyer un rapport d'erreur.
Alors après de long moments de recherches sur le net (jusqu'à la 12è pages de google quand même) je m'en remet à vous. Merci d'avance

3 réponses

julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
5 août 2006 à 19:28
Avant toute autre chose, vérifie que ta dll est bien chargée le LoadLibrary. POur ça, teste la valeur de DLLHandle. Regarde dans MSDN ce que te renvoies LoadLibrary sur une erreur, je ne sais plus si c'est NULL ou INVALID_HANDLE_VALUE.


Vive le C
Savon
0
nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
7 août 2006 à 10:00
Rajoute un extern "C" devant la déclaration de tes fonctions.

En plus, je me rend compte que tu n'a pas mis le bon typedef, le typedef correct est sous cette forme :

typedef [type_retour](*[nom_typedef])([params]);

Donc pour toi : typedef void(*PointeurFonctionType)();

Sachant qu'on peut toujours enlever une ligne à un programme, et que dans un programme il y a toujours un bug, un programme peut se résumer à une ligne avec un bug.
0
cs_seb5 Messages postés 2 Date d'inscription mardi 1 août 2006 Statut Membre Dernière intervention 7 août 2006
7 août 2006 à 22:05
Merci de vos réponses, je teste dès que je peux.
0
Rejoignez-nous