BuilderC++, dll dynamique
Erwann Messages postés 52 Date d'inscription Statut Membre Dernière intervention -
mega-squall - 15 nov. 2006 à 19:41
mega-squall - 15 nov. 2006 à 19:41
A voir également:
- BuilderC++, dll dynamique
- Tableau croisé dynamique - Guide
- Exemple tableau croisé dynamique télécharger - Télécharger - Tableur
- Liste déroulante dynamique excel - Guide
- Forum Excel
- Forum Windows
4 réponses
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.
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
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.p
//------------------------------
#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.p
//------------------------------
#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 ^^