| |||||
| Dernière réponse | ||
|---|---|---|
| Sujet : [C++] Passer des structures d'une dll a un exe. | ||
| chrisbk |
|
|
| Aperçu |
|---|
| Vue Rapide de la discussion |
|---|
| chrisbk |
|
| BENB |
|
| deathsharp | imagine que tu as une DLL avec 2564 fonctions. tu fait des GetProcAddress pour chacune? :D
avec les lib, je crois qu'il certaine fois ou t pas obliger de toucher a l'exe |
| chrisbk |
|
| BENB | Godbout > de toute maniere il te faudra des dependances dans un sens ou dans l'autre...
sol1 -> la lib est independante de l'exe... tu utilise les .h et le .lib de la dll... sol2 -> l'exe est independant de la dll c'est la lib qui utilise les .h et le .lib de l'exe, la lib est chargee par LoadLibrary... sol3 > exe et dll sont independants mais dependent d'une meme Dll (stategie Plug-in proposee plus tot dans ce topic) sinon, impossible de partager structures et classes... De plus les dependances que tu crois gommer ainsi sont en fait pires... car en fait tu va utiliser GetProcAdress, et si tu changes le proto de ta Func aie aie aie... |
| chrisbk |
|
| godbout | nan parce que j'utilise pas les lib |
| deathsharp | oui il faut la dll et son lib que t'inclu
ca va pas? |
| godbout | Ben en fait j'ai pas essaye ca parce qu'il me semble que c'est pour quand tu charges ta dll grace a un lib.
mais merci ;) je verrai ca |
| deathsharp |
[edtdd]--Message édité par deathsharp--[/edtdd] |
| godbout |
|
| deathsharp | j'arrive en cours mais on peux tres bien exporter une classe d'une dll
pour le debut j'avais rien compris :D |
| BENB |
|
| chrisbk |
|
| BENB |
|
| chrisbk | arf, dans tous les cas tu seras quand meme oblige d'inclure un .h
(si tu veux un truc un peu propre) ne serait ce que pour definir le type pointeur sur fonction que tu recup de ta DLL, truc du genre : typedef void (*LPGETRENDERERINFO)(char *desc,int size); au moins a chaque fois que tu utilise ton loader tu n'a pas besoin de le redefinir et si tu le modifie tous seront mis a jour a la prochaine compilation... |
| godbout | chrisbk -> C'est la classe qui desalloue tout. Y a pas de pb la dessus.
BENB -> Le but de la dll c'etait de pas s'embeter a inclure les .h, etc... Juste faire appelle a une fonction de la dll, recuperer le resultat, puis pourquoi pas faire une dll pour afficher. |
| chrisbk | (oue au passage, ca me fait un peu peur ton hstoire parce que a priori si c ta DLL qui charge, c elle qui alloue la memoire . Ce sera donc a elle de la desaouller sinon plantage, fais gaffe a ca) |
| BENB | Godbout > pour que le constructeur soit appelle, il faudrait qu'il soit public...
pourquoi mettre cette classe dans une Dll ? une fois faite c'est un module, pour le reutiliser il suffit de l'inclure dans le projet et de recompiler... enfin je ne comprends pas trop ta demarche... tu nous dis vouloir faire ta Dll tel un plug-in, et en meme temps tu voudrais recuperer dans l'exe le resultat :??: |
| godbout | Bon recapitulatif:
Projet de Billard en vue. Ce projet va etre compose d'au minimum un exe, et d'une dll dont la fonction sera de charger un fichier 3DS, et de renvoyer le contenu a l'exe dans une structure. Pourquoi dans une dll ?? Parce que comme ca, pour des projets futurs, j'aurai juste a inclure la dll. Jusque la c'est bon ? La dll: Elle est faite d'une classe. La seul fonction public de cette classe est CLoad3DS::Import3DS, elle fait tout le travail. Elle demande en argument un nom de fichier, et remplit une structure. (Import3DS(t3DModel *pModel, const char *)). J'ai essaye d'exporter Import3DS, ca marche mais le constructeur n'est pas appele (puisque prog degueu), donc ca marche pas (pointeur non alloue). Je pourrais surement bidouille un peu mais la prog degueu j'aime pas (tu dois le savoir maintenant :D). Je veux donc pouvoir exporter la classe, comme on exporte une fonction. C'est plus clair la ? Peut etre que la technique de Pierre marche, je ne pourrais essayer que ce soir. |
| chrisbk | comprends pas trop ce que tu veux... |
| godbout |
|
| chrisbk |
|
| godbout |
|
| chrisbk | utilise les DLL avec des export de symbole (cf code genere par visu) pour faire tes classes exportees |
| godbout | ok
ben j'essaierai, parce que jusqu'a maintenant je faisais juste un GetProcAdress(hInstLib, "nomfonction" ); Mais je vois ca ce soir alors.. merci ;) |
| Pierre Maurette | Je suis pas sûr de piger ton problème, mais je persiste sur l'utilisation des fichiers ".h". C'est comme ça que tu peux appeler des fonction de Windows (qui sont en .dll). Par exemple, si tu utilises une fontion qui renvoie un RECT:
#include <windows.h> #include <windowsx.h> #include <commctrl.h> #include <string.h> RECT Area; SystemParametersInfo(SPI_GETWORKAREA, 0, &Area,0); RECT est défini dans windef.h (appelé par un des autres) comme: typedef struct _RECT { // rc LONG left; LONG top; LONG right; LONG bottom; } RECT; pour tes fonctions à toi, c'est pareil |
| godbout | Ben pour recupere les fonctions de la dll je fais un LoadLibrary et un GetProcAddress.
Ma dll contient donc un .DEF, dans lequel de toute facon je n'arrive pas a exporter la classe. Mais j'ai pas essaye de faire comme tu me le dis, peut etre que ca fonctionne, mais alors ca me parait tres bizarre, puisque je n'ai meme pas l'adresse de la fonction de la dll... |
| chrisbk | houla je ne te suis pu
mettons, tu as : CLoad3DS { void load(char *file); } L'implantation de cette classe se trouve dans ta DLL et dans ton exe tu aurais, genre : CLoad3DS load; load.load("pouet.3ds" ); et donc pour faire cela tu as besoin du .h |
| chrisbk | pkoi tu pourrais pas exporter la classe ? |
| godbout | Ouais mais je vois pas a quoi ca sert d'inclure le fichier .h de la dll dans mon .exe, puisque je n'appelle pas directement la classe dans l'exe, je l'appelle a travers la dll. |
| Pierre Maurette | Que ce soit un '.lib', un '.dll', que ça renferme des fonction ou des classes, tu fais systématiquement un '.h'. C'est l'interface publique de tes fonctions (ou classes). Si tu écris une collection 'pignouf.dll', tu écris également donc 'pignouf.h', avec les prototypes, les types de données, structures etc.., et plein de commentaires. Tu mets alors dans le source de l'exe utilisateur: #include "pignouf.h". Penses à mettre au début de "pignouf.h"(c'est plus propre): #if !defined(PIGNOUF_H) #define PIGNOUF_H . . . . et à la fin #endif Même si ta lib ne te sert qu'à toi tout seul, tu dois pouvoir la réutiliser 6 mois plus tard en lisant simplement le "pignouf.h". |
| godbout | Bon pour les struct pas de pb, mais ca veut dire que pour les classes c'est pareil alors ??
Parce que j'ai fait une classe CLoad3DS, qui me permet de charger un fichier 3DS. Je veux en faire une dll, que je pourrai donc utiliser dans chaque prochain programme. Mais si je peux pas exporter la classe je fais comment ?? :??: |
| godbout | buitoni -> ok, c'est bien du C++
chrisbk -> ben faut bien sinon le billard il est pas pres d'etre fini :D deathsharp -> :??: |
| deathsharp |
|
| chrisbk | (gb : tu bosses le week end toi ? :D ) |
| Buitoni | Tu dois redefinir la structure dans l'exe.
En fait le plus simple c'est de le definir dans un .h (ou .pas mais c du c++ toi je pense non?) et de l'inclure dans les deux morceaux... |
| godbout | Salut a tous ;)
J'aimerais appeler une fonction dans mon exe qui renvoie une structure. Est ce que je suis oblige de redefinir la structure dans les sources de l'exe ou alors je peux exporter une structure comme une fonction dans les sources de la dll ?? Merci ;) |




