BuilderC++, dll dynamique
Fermé
Erwann
Messages postés
52
Date d'inscription
jeudi 24 juillet 2003
Statut
Membre
Dernière intervention
16 septembre 2005
-
14 juin 2005 à 16:11
mega-squall - 15 nov. 2006 à 19:41
mega-squall - 15 nov. 2006 à 19:41
A voir également:
- BuilderC++, dll dynamique
- Tableau croisé dynamique - Guide
- Liste déroulante dynamique excel - Guide
- Xinput1_3.dll - Forum Windows
- Ads.fiancetrack(2).dll - Forum Windows 10
- Problème avec XINPUT1_3.dll - Forum Jeux PC
4 réponses
mamiemando
Messages postés
33446
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
20 décembre 2024
7 812
14 juin 2005 à 20:27
14 juin 2005 à 20:27
Je ne comprends pas trop ce que tu entends par "intégrer dynamiquement une librairie". Pour moi ca va à l'encontre du principe même de la compilation du c++. Où alors j'ai pas tout compris ;) Bon en gros tu as un :
Tu le changes en :
et pour tes classes :
Mais comme il y a un # c'est fait par le précompilateur... au même titre que le #include de ta librairie.
#include <lib_dyna>
Tu le changes en :
#include <lib_dyna> #define LIB_DYNA
et pour tes classes :
#ifdef LIB_DYNA class plop{ //... }; #endif
Mais comme il y a un # c'est fait par le précompilateur... au même titre que le #include de ta librairie.
Erwann
Messages postés
52
Date d'inscription
jeudi 24 juillet 2003
Statut
Membre
Dernière intervention
16 septembre 2005
13
15 juin 2005 à 08:43
15 juin 2005 à 08:43
re
Je n'ai pas utilisé le mot "intégré" parce que je ne crois pas qu'il soit juste.
Je n'ai pas bien m'expliquer, parce que ce que tu me proposes ne correspond pas du tout. les dlls contiennent du code, des fonctions, des classes. Le problème est que je voudrais, dans mon exécutable, pouvoir utiliser ces classes. Le terme dynamique signifie que une dll ne sera chargée que lorsque j'ai besoin d'elle, (au contraire du statique ou toutes les librairies sont chargées des le départ). Mais je n'ai pas trouvé comment, en dynamique, pouvoir utiliser une classe déclarée dans une dll.
J'espere que j'ai été plus clair. Et que donc tout le monde me donnera plein d'aide et de cadeaux ;)
Wan
Je n'ai pas utilisé le mot "intégré" parce que je ne crois pas qu'il soit juste.
Je n'ai pas bien m'expliquer, parce que ce que tu me proposes ne correspond pas du tout. les dlls contiennent du code, des fonctions, des classes. Le problème est que je voudrais, dans mon exécutable, pouvoir utiliser ces classes. Le terme dynamique signifie que une dll ne sera chargée que lorsque j'ai besoin d'elle, (au contraire du statique ou toutes les librairies sont chargées des le départ). Mais je n'ai pas trouvé comment, en dynamique, pouvoir utiliser une classe déclarée dans une dll.
J'espere que j'ai été plus clair. Et que donc tout le monde me donnera plein d'aide et de cadeaux ;)
Wan
ferry
Messages postés
2
Date d'inscription
mardi 16 mai 2006
Statut
Membre
Dernière intervention
16 mai 2006
16 mai 2006 à 09:54
16 mai 2006 à 09:54
Jai vu ton message pour ta dll et jaimerai savoir si tu as reussi a faire communiquer ta dll avec ton executable ? si oui comment tu as fai sil te plai ,,,,?
Salut,
Malheureusement, lorsqu'une DLL est chargée dynamiquement par un programme, celui ci ne peut utiliser que les fonctions qu'elle contient. Lorsqu'une DLL contient une classe, elle doit etre chargée statiquement pour pouvoir être utilisée par le compilateur (car il s'agit d'un typedef ...)
En revanche, si tu veux toujours travailler en objet et en dynamique avec les avantages que cela apporte, tu peux définir une classe d'encapsulation dans ton programme et coder ses méthodes pour qu'elles appellent des fonctions de la DLL. Par exemple :
`LecteurCarte.dll` contient la fonction `int lecteur_lire (char);`.
Cette fonction contient le code de `int LecteurCarte::Lire (char)`.
Dans ton programme tu codes :
//------------------------------
// monProgramme.hpp
//------------------------------
class LecteurCarte {
int Lire (char port);
};
//------------------------------
// monProgramme.cpp
//------------------------------
#include "monProgramme.hpp"
int LecteurCarte::Lire (char port) {
int (*ptr) (char);
HMODULE dll_handle = LoadLibrary ("LecteurCarte.dll");
ptr = ((int)(*)(char)) GetProcAddress (dll_handle, (LPCSTR) "lecteur_lire");
int result = ptr (port);
FreeLibrary (dll_handle);
return result;
}
//------------------------------
Tu n'as pas une flexibilité totale de la classe (car tu ne peux pas définir les méthodes pures ou les attributs depuis la DLL), mais tu peux tout de même customiser le code executé par les méthodes ...
---
mega-squall,
En espérant que ca soit clair et utile ^^
Malheureusement, lorsqu'une DLL est chargée dynamiquement par un programme, celui ci ne peut utiliser que les fonctions qu'elle contient. Lorsqu'une DLL contient une classe, elle doit etre chargée statiquement pour pouvoir être utilisée par le compilateur (car il s'agit d'un typedef ...)
En revanche, si tu veux toujours travailler en objet et en dynamique avec les avantages que cela apporte, tu peux définir une classe d'encapsulation dans ton programme et coder ses méthodes pour qu'elles appellent des fonctions de la DLL. Par exemple :
`LecteurCarte.dll` contient la fonction `int lecteur_lire (char);`.
Cette fonction contient le code de `int LecteurCarte::Lire (char)`.
Dans ton programme tu codes :
//------------------------------
// monProgramme.hpp
//------------------------------
class LecteurCarte {
int Lire (char port);
};
//------------------------------
// monProgramme.cpp
//------------------------------
#include "monProgramme.hpp"
int LecteurCarte::Lire (char port) {
int (*ptr) (char);
HMODULE dll_handle = LoadLibrary ("LecteurCarte.dll");
ptr = ((int)(*)(char)) GetProcAddress (dll_handle, (LPCSTR) "lecteur_lire");
int result = ptr (port);
FreeLibrary (dll_handle);
return result;
}
//------------------------------
Tu n'as pas une flexibilité totale de la classe (car tu ne peux pas définir les méthodes pures ou les attributs depuis la DLL), mais tu peux tout de même customiser le code executé par les méthodes ...
---
mega-squall,
En espérant que ca soit clair et utile ^^