Comment inclure une dll dans une dll?

Signaler
Messages postés
5
Date d'inscription
mardi 29 avril 2003
Statut
Membre
Dernière intervention
19 avril 2004
-
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
-
Bonjour.

Je cherche a faire une dll qui servent d'interface en C pour une autre dll qui elle est en C++

je suis debutant, j'arrive a faire une dll basique, a l'importer dans du code sous visual et donc l'utiliser sans probleme en employant la methode suivante :

#include "madll.h"

propriete du projet, editeur de liens externes, ressource supplementaire : madll.lib

Mais si je fais ca dans ma nouvelle dll servant d'interface j'obtiens toute une floppée d'erreurs a la compilation, et la vraiment je bloque. quelqu'un a t'il une idée du probleme?

je cherche egalement un tutorial serieux et complet sur comment faire des dll. J'ai deja consulté msdn, qui offre une presentation avancée des dll, mais n'explique pas comment faire :/

merci d'avance pour votre aide.

5 réponses

Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
donne les erreurs ça vient peut-être d'un autre pb.

le bouquin de Richter (en anglais) explique les dll :
http://brunews.free.fr/brunews/download/JR4.zip
http://brunews.free.fr/brunews/download/JR4Sources.zip
Messages postés
5
Date d'inscription
mardi 29 avril 2003
Statut
Membre
Dernière intervention
19 avril 2004

merci ymca pour le livre ca va suremlent beaucoup m'aider.

sinon pour les erreurs, bah en fait il m'en genere 100.

alors plutot que de te les envoyer je peux te dire comment obtenir ce resultat en 15 secondes chrono si tu as visual C++ 2003 et XP, sinon dis moi et je t'enverrai le rapport de compilation :

dans visual nouveau projet Win32 console
dans l'assistant de creation de projet cocher dll
dans le .cpp de la dll faire un include "gdiplus.h"
et dans les options du projet, comme cité un post plus haut, dans les liens externes rajouter gdiplus.lib

compiler et admirer le defilé.
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
avec #include <objbase.h> avant #include <gdiplus.h> ca marche nettement mieux.
Messages postés
5
Date d'inscription
mardi 29 avril 2003
Statut
Membre
Dernière intervention
19 avril 2004

Hmmmm :/ bon je nage complet mais alors vraiment complet la!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

c'est quoi objbase?

voila pourquoi je nage complet :

Sur les dll, j'ai lu que pour la maintenance il etait preferable de n'avoir qu'un seul .h hors par defaut le wizard de visual crée dans mon projet dll stdafx.h et stdafx.cpp

hors lorsqu'on distribue la dll, si j'ai bien compris, il faut fournir le .dll, le .lib et le .h . Le probleme c'est que si tout le monde donnait stdafx.h bah on bloquerait vite :)

Alors vous allez me dire bah tu fait un madll.h et c'est ca que tu distribue. Ok alors je cherche a me debarasser de stdafx.h en le remplacant par madll.h, et en faisant le include qui faut dans madll.cpp.

Peut etre allez vous me dire "mais non ne te debarrasse pas de stdafx, tu en as besoin", oui mais si je fais des includes dedans, je suis obligé dans madll.h de faire un include de stdafx sinon dans madll.h il ne sera pas de quoi je lui parle quand je veux utiliser quelquechose d'inclu. Du coup je suis obligé de fournir le madll.dll, le madll.lib, madll.h et stdafx.h !!!!!!!!!!!!!!!!

De toute facon, si je place le contenu de stdafx.h dans madll.h, et que je remplace donc le #include "stdafx.h" par #include "madll.h" dans madll.cpp, je ne sais absolument pas pourquoi j'obtiens alors sur madll.h un "fin de fichier inatendu" . Pourquoi madll.h ne passe pas alors qu'avec stdafx.h il n'y a pas de probleme? (rappel ils ont rigoureusement le meme contenu)

Je suis donc revenu a l'etat initial de la dll avec cet ~{#{[#~de stdafx.h, dedans je fais les includes pour objbase et gdiplus. Pas de pb a la compilation.

dans madll.h j'inclus stdafx.h, pour pouvoir utiliser ce qui est inclus dans stdafx.h, et bien non ca me dit grossierement que les types n'existent pas bref les includes ne sont pas fait :( (deprimant)

Bref, j'ai essayé mille et une chose et rien n'y fait je collectionne les erreures de compilation depuis que j'essaye de faire une dll appellant une autre dll, je galere depuis vendredi je ne vais pas tarder a etre chauve a force de m'arracher les cheveux.

quelqu'un aurait il un code simple demontrant une dll important une autre dll et utilisant simplement une de ses fonctions?
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
tout d'abord, StdAfx.h (et .cpp) sert pour les entêtes précompilés (pour aller plus vite) et comprend simplement les includes du projet qui ne sont jamais modifiées (celle des libs standard C, API...). Si tu n'en veux pas, créer un projet win32 exe ou dll VIDE.

en effet, pour distrubuer une dll, il faut le .dll, le .lib et le .h
mais rien ne t'emêche d'aboir d'autre .h dans ton projet dll.
dans le .h il faut simplement mettre le prototype des fonctions de la dll.

en ce qui conceren objbase.h, il contient simplement une définition de type nécessaire avec gdiplus.h, comme tu doit aussi avoir windows.h.

voici un ex de dll :

stdafx.h : entêtes précompilées.
#ifndef AFX_STDAFX_H_INCLUDED_
#define AFX_STDAFX_H_INCLUDED_

// entêtes API Win32
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <tchar.h>
#endif	// AFX_STDAFX_H_INCLUDED_



stdafx.cpp : entêtes précompilées.
#include "StdAfx.h"


icons.h : l'entête de la dll
#ifndef AFX_ICONS_H_INCLUDED_
#define AFX_ICONS_H_INCLUDED_
//==========================================// Macro pour imporation ou exportation (ICONS_EXPORTS à définir pour construire la dll)
//==========================================#ifdef ICONS_EXPORTS
#define ICONS_API __declspec(dllexport)// WINAPI
#else
#define ICONS_API __declspec(dllimport)// WINAPI
#endif

//==========================================// Fonctions de la librairies.
//==========================================
extern "C"
{
HICON ICONS_API Icons_LoadIcon(int Id);
BOOL  ICONS_API Icons_ExtractIcon(int Id, LPCTSTR lpszFileName);
}
#endif	// AFX_ICONS_H_INCLUDED_


icons.cpp : point d'entrée de la dll :
#include "StdAfx.h"
#include "Icons.h"

HINSTANCE	g_hDllInstance= NULL;	// instance de la librairie

BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD  dwReason, LPVOID lpReserved)
{
// sauvegarde instance de la librarie
if(dwReason == DLL_PROCESS_ATTACH)
g_hDllInstance = hInstance;
// retour
return TRUE;
}

HICON ICONS_API Icons_LoadIcon(int Id)
{
...
}

BOOL ICONS_API Icons_ExtractIcon(int Id, LPCTSTR lpszFileName)
{
...
}


icons.def : fct exporteés de la dll
EXPORTS
Icons_LoadIcon
Icons_ExtractIcon


il peut ensuite y avoir d'autre .h et .cpp. chaque cpp devra avoir #include "sdtafx.h" au début.

tous les prototype des fct exportées doivent être dans "icons.h", seule entête à distribuer avec la dll et le .lib

pour l'utilsation que ce soit un exe ou une dll, c'est pareil, inclure icons.h dans le source et linker avec le .lib