Inclure un fichier binaire (dll) ?! - C++ - Programmation
Marsh Posté le 15-11-2004 à 21:13:56
Il me semble que ce genre de truc se fait par custom resource.
Mais j'suis d'accord avec serge, c'est crade d'embarquer la dll dans l'exe. Autant compiler la lib en static et linker proprement.
Marsh Posté le 15-11-2004 à 21:20:50
Surtout je vois pas trop à quoi ça sert... Met en resource et on en parle plus.
Marsh Posté le 15-11-2004 à 21:25:20
retrox a écrit : Il me semble que ce genre de truc se fait par custom resource. |
Ouais quand tu as le .lib ou le code source de la dll
Marsh Posté le 15-11-2004 à 21:30:36
Tu peut toujours essayer ça : http://www.binary-soft.com/dll2lib/dll2lib.htm
J'ai trouvé ça en cherchant un peut mais ça ne me donne pas du tout confiance.
De toute façon, j'ai bien peut que ce que tu demandes soit très compliqué. Je ne suis pas un pro en assembleur et autre formats de fichiers executables, mais il me semble que ça risque de poser quelques problèmes :
Mais bon, à la base les dlls ne sont pas faites pour être intégrées dans un executable !
Marsh Posté le 15-11-2004 à 21:33:53
Inclure la dll dans l'exe ne fait aucune différence avec inclure une image ou autre chose. Ca sera considéré comme de la donnée brute et non une dll.
Marsh Posté le 15-11-2004 à 21:34:59
Code :
|
L'erreur c'est l'erreur 0x715 = "The specified resource type cannot be found in the image file.'
Et dans le fichier rc, une seul ligne:
DLL DATA DISCARDABLE "xxx.dll"
Je comprends vraiment pas pourquoi ca marche pas
Marsh Posté le 16-11-2004 à 02:14:24
Bo c'est pas vraiment sale, des fois t'as pas les sources donc tu peux pas compiler en statique, et tu veux n'avoir qu'un fichier. Les écoute pas tous ces méchants mon bon AthlonSoldier. Exemple de l'utilisation de BASS, librairie audio, un truc vieux donc je me souviens pas forcément bien hein. Note: c'est du gcc mingw, donc avec leurs outils pour les ressources (remarque ça passait ptet aussi sous vc, je sais plus, au pire y'a pas grands changements).
dans le .rc:
Code :
|
Donc le bass.dll.h ça ressemble à ça:
Code :
|
C'est créé avec un bête soft qui fait bin to ascii. Bref tu peux choper ça sur le net ou le coder en 2s.
Ensuite faut extraire ta dll dynamiquement et la charger dynamique, et donc tous tes appels de fonctions se font par pointeurs.
WinDemoManager.h:
Code :
|
Bon bah pointeurs sur les données...
WinDemoManager.cpp:
Code :
|
Donc là bêtement ça mets tous les pointeurs définit dans le bass.h à la bonne valeur. Et c'est gagné tu peux appeler tes fonctions.
Le code de WinDataLoader:
Code :
|
Alors là ça extrait une ressource dans un fichier, dans un dossier temporaire. T'as plus qu'à faire le LoadLibrary sur ce fichier.
Valà je pense que y'a tout. Alors y'a des chance par contre que tu aies à modifier le .h (les...) de ta dll si c'est pas prévu comme pour BASS.
Marsh Posté le 16-11-2004 à 06:11:09
Je crois que le truc que t'as pas compris, c'est que tu n'as pas besoin des sources pour linker statiquement. Sous linux :
/home/nicolas/tmp% gcc -o lib_static -static -lc lib.c |
Edit : j'ajoute le test qui tue
/home/nicolas/tmp# chroot . ./lib_dynamic |
Marsh Posté le 16-11-2004 à 07:32:04
Merci d'avoir pris la peine de répondre a vous deux
Mais j'ai trouvé une soluction crade en faisant un :
Code :
|
Marsh Posté le 16-11-2004 à 10:37:40
Mettre une dll en resource pour la recréer à chaque lancement pour la charger puis l'effacer... Je suis pas convaincu de l'intérrêt en plus de la difficulté de faire la chose dès que y'a une classe à importer.
Marsh Posté le 16-11-2004 à 12:37:22
matafan > il est sous windows avec vc... certes j'ai aussi un .sh qui transforme un .la en .dll, et vu la gueule du truc ça doit être faisable dans l'autre sens. Et franchement ton exemple... je vois pas le rapport. Où t'as prouvé que t'avais pas les .la des 3 libs dans ton path ? Bon quoiqu'il en soit un .so et un .dll ça n'a rien à voir (l'un est super l'autre est pourri).
HelloWorld > certes.
Marsh Posté le 16-11-2004 à 18:37:37
HelloWorld a écrit : Mettre une dll en resource pour la recréer à chaque lancement pour la charger puis l'effacer... Je suis pas convaincu de l'intérrêt en plus de la difficulté de faire la chose dès que y'a une classe à importer. |
C'est surtout que dans certain cas tu veux qu'il y est juste un exe sans dll
Mais ca tu dois pas connaitre
Marsh Posté le 16-11-2004 à 19:57:57
Supair...
Quand ton exe est linké avec une dll tu peux faire ce que tu veux il faut la dll, à part quelque part sur le disque.
Sinon je connais un truc, ça s'appelle les installeurs, les zips autroextractibles, etc...
Marsh Posté le 17-11-2004 à 09:13:06
Et si tu veux garder un seul exe, en zippant, t'es obligé de te faire un autre prog qui va dropper l'exe et tous les fichiers nécessaires dans un dossier temp. Bref t'arrête 2s: y'a des gens qui veulent qu'on double-click sur le fichier exe/com et qu'il se lance direct, que ce soit à l'intérieur d'un zip ou autre sans avoir à créer un dossier, extraire des trucs, en installer d'autres, etc. Me réponds pas win xp, tout le monde ne l'a pas. Bref si AthlonSoldier voulait le faire, si moi je l'avait déjà fait, et si des distributeurs de lib comme BASS (qui n'est pas rien: ça lit des ogg, des mod, des mp3, des mo3 (mod compressés en mp3), etc.) ont inclus cette fonctionnalité c'est que y'avait une demande. Toi tu le fais pas c'est cool, c'est pas une raison pour débarquer avec ton pessimisme.
Et oui on connait les chemins de recherche et on sait ce qu'est une dll merci.
Marsh Posté le 17-11-2004 à 11:08:58
En fait je pensais à un zip autoextractible, option de winzip...
Marsh Posté le 17-11-2004 à 14:42:34
Oui et si tu compare 2s les deux solutions tu remarques qu'elles n'ont rien en commun... Un zip est un zip et s'extrait quelque part, même automatiquement, un exe se lance et l'utilisateur n'a pas à choisir un chemin ou quoique ce soit.
Bon c'est mon dernier post dans ce thread, le débat est stérile: un gars a posé une question, si tu veux discuter de l'intérêt du truc c'est pas le même sujet.
Marsh Posté le 17-11-2004 à 15:03:49
C'est toi qui t'énerves tout seul. Il a demandé à inclure une dll, il a pas dit que c'était pour l'extraire. J'ai voulu savoir si des fois il espérait pas transformer ainsi sa dll en lib statique. D'où ma question & remarque. Toi tu sais peut être bien ce qu'est une dll, mais c'est pas le cas de tout le monde. Des cas de ce genre on en a déjà vu.
Pour BASS, je connais pas, mais je vois pas pourquoi ils ont pas simplement créé une version statique de la lib. C'est peut être une super lib, mais le code que tu as posté contient des fuites de mémoire, y'a pas le FreeLibrary, etc...
Marsh Posté le 17-11-2004 à 15:13:47
Pfou... eh j'ai posté un BOUT de code... si tu notes y'a pas le destructeur de ma classe, qui évidemment contient le FreeLibrary... Arrête 2s, je suppose que le gars sait coder en lisant l'explication, le but n'est pas de fournir un code à copier coller. Après tu vas encore dire que je m'énerve tout seul avec des remarques bidons comme celle-ci... Puis c'est sûr que si tu supposes que le gars sait pas ce qu'il veut faire en lisant sa question et que tu lui en poses 10 avant de lui répondre on va pas avancer.
Ils filent pas de version statique parce que faudrait en filer 300 versions pour tous les compilos, dans tous les modes de compil imaginables. D'autres exemples ? Tokamak (librairie physique temps réel très rapide) file que sous forme de dll aussi.
Marsh Posté le 17-11-2004 à 15:45:05
g012 a écrit : D'autres exemples ? Tokamak (librairie physique temps réel très rapide) file que sous forme de dll aussi. |
Perdu, y'a 4 lib statiques fournies (mono/multithread, release/debug).
Bon t'as pas eu de chance je te l'accorde.
Ok ok y'a des libs que sous forme de dll. Le probleme il est pas là. Quand t'as des dll à trimballer (ce qui devient la règle car le moindre prog compilé avec VC++ >= 7 nécessite 1 ou 2 dll à refourguer avec l'exe, mais on peut lier en statique) on fait pas de la bidouille, on fait un joli paquet en 2 minutes avec un installeur.
Un truc idiot : si tu lances 2 fois ton exe, hop tu dupliques toutes tes dll. En plus d'avoir un exe plus gros déjà (car il embarque la dll), tu dupliques encore une fois la dll en mémoire pour chaque process.
Et bon de toutes façons cette technique de linking dynamique est vite limitée dès qu'on est en C++ (name mangling).
Cette solution de dll embarquée me semble valable dans le cas où l'exe fait aussi office d'installeur. Mais c'est assez rare, surtout maintenant que des softs permettent de très facilement en faire un.
Marsh Posté le 17-11-2004 à 16:25:15
Bon cette fois c'est pour de vrai que c le dernier post.
Tokamak a certes 4 libs statiques, pour vc je sais plus quelle version, et UNIQUEMENT pour utiliser la dll. Ça n'est nullement des lib statiques autonomes (tu as BESOIN de la dll pour utiliser ton exe). Avant de poster avec des phrases insultantes style "perdu machin", tu devrais faire plus qu'extraire le zip du site et vaguement regarder ce qu'il contient. Et de plus quid de mingw, cygwin, etc. ? J'ai la vague impression que t'as une tête de 500 km de diamètre et que tu t'amuses avec ta mauvaise foi. Tu fais exprès de pas comprendre. Le but n'est pas de faire un installeur. Le but est de lancer l'exe et c'est tout sans aucune dépendances. L'optique de la réutilisabilité des dll, etc. n'a rien à voir. Bon puisque vraiment tu insites lourdement pour faire exprès de pas comprendre: t'as une démo disons, dans un zip (typiquement la façon dont c'est distribué sur scene.org), et tu veux pas forcer l'utilisateur à extraire 40 fichier mais juste à lancer l'exe depuis le zip. Voilà. Pfouuuuuuuuuuuuuuuuuuuuuu.
Marsh Posté le 17-11-2004 à 17:10:50
g012 a écrit : Bon cette fois c'est pour de vrai que c le dernier post. |
Je commence à douter que tu saches ce qu'est une dll. Y'a un lib par dll, c'est tout. Je suis désolé de te décevoir, mais les 4 libs sont bien des libs statiques (et donc autonome).
Citation : |
De plus, par défaut ça n'utilise pas la dll, il faut définir TOKAMAK_USE_DLL
Code :
|
Citation : Avant de poster avec des phrases insultantes style "perdu machin", tu devrais faire plus qu'extraire le zip du site et vaguement regarder ce qu'il contient. Et de plus quid de mingw, cygwin, etc. ? J'ai la vague impression que t'as une tête de 500 km de diamètre et que tu t'amuses avec ta mauvaise foi. |
Ah bon je t'ai insulté... Et au passage un tête de 500km de diamèter c'est pas possible, je me congnerais aux sattelites.
Citation : Tu fais exprès de pas comprendre. Le but n'est pas de faire un installeur. Le but est de lancer l'exe et c'est tout sans aucune dépendances. L'optique de la réutilisabilité des dll, etc. n'a rien à voir. Bon puisque vraiment tu insites lourdement pour faire exprès de pas comprendre: t'as une démo disons, dans un zip (typiquement la façon dont c'est distribué sur scene.org), et tu veux pas forcer l'utilisateur à extraire 40 fichier mais juste à lancer l'exe depuis le zip. Voilà. Pfouuuuuuuuuuuuuuuuuuuuuu. |
On est d'accord, ce n'est pas une chose pratiquée par des applis professionnelles. De toutes façons moi j'utilise WinRar et il dézippe tout quand je lance un exe
C'est minable, mais j'ai envie de le faire quand même : si tu réponds pas c'est que t'as une p'tite bite.
Marsh Posté le 17-11-2004 à 17:20:25
Citation : De plus, par défaut ça n'utilise pas la dll, il faut définir TOKAMAK_USE_DLL |
OK je viens de télécharger la dernière version. Ça n'y était pas avant. Enfin ça ne change rien à ce que je disais: t'as pas la lib pour mingw par exemple. Donc le pb reste entier dès que t'as une dll et pas de sources.
Enfin bref content de voir que t'as ENFIN admis que y'en a qui veulent faire ça et qu'ils sont pas cinglés pour autant...
PS: j'utilise aussi winrar, mais quand on distribue un truc... tout le monde n'a pas la mm chose sur son pc.
Marsh Posté le 17-11-2004 à 17:24:38
Au passage ma première réponse un peu aggressive ne t'était pas detinée.
Marsh Posté le 17-11-2004 à 23:14:06
HelloWorld a écrit : Supair... |
Qui te dit que je crée un shareware ou tout autre logiciel pour être distribué publiquement ?
Marsh Posté le 17-11-2004 à 23:19:37
D'alleurs c'etait une DLL (où j'en inclué une autre) meme pas un EXE, alors accroche toi pour l'execute ou l'installer par un installeur (pas de sens)
Marsh Posté le 17-11-2004 à 23:26:37
Ah ouai pas con : cette dll est à son tour incluse dans un exe et ça fait des poupées russes
Marsh Posté le 20-11-2004 à 15:04:50
J'ai eu utilisé nasm et son incbin pour faire ce genre de chose, le tout en custom build step sous visual.
Marsh Posté le 15-11-2004 à 18:36:05
Bonjour,
J'aimerai savoir comment inclure une dll dans la section ".data" du futur fichier genere avec VC++
J'ai essaye plein de trucs comme #Includebinary & co ( ) mais sans succes.
J'ai alors opter pour quelque chose de ce genre :
Mais evidemment a la compilation ca me renvoit une erreur en disant quela chaine est trop longue...
Bref il n'y aucune solution a pars les mettre sous forme de resources a l'executable ?