cs_seb5
Messages postés2Date d'inscriptionmardi 1 août 2006StatutMembreDernière intervention 7 août 2006
-
5 août 2006 à 17:19
cs_seb5
Messages postés2Date d'inscriptionmardi 1 août 2006StatutMembreDerniè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:
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;
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
julienbj
Messages postés452Date d'inscriptionjeudi 4 décembre 2003StatutMembreDernière intervention19 décembre 200815 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.
nightlord666
Messages postés746Date d'inscriptionvendredi 17 juin 2005StatutMembreDernière intervention23 mai 200710 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.