Dans une bibliothèque dynamique écrite en C++, est-ce qu'il est possible d'exporter plusieurs fonctions ayant le même nom ou pas (des fonctions surchargées par exemple) ? Et plusieurs fonctions ayant la même signature, mais provenant de classes différentes ?
Et si la surcharge de fonctions est possible, comment on peut les différencier, au chargement ?
Merci.

« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas
. »
OK, donc il vaut mieux que j'exporte des fonctions C.
Merci.

« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas
. »
En fait, de toute façon ça n'a pas d'importance de pouvoir surcharger les fonctions et ce n'est pas très grave si le nom du scope n'est pas conservé donc je peux me débrouiller en exportant en C.
C'est pour faire des plugins en fait. Les dll/so stockent le code des fonctions du plugin, et mon application charge les plugins ensuite, à travers une classe qui sert de wrapper.

« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas
. »
OK merci.
Sinon, j'ai un petit problème : les plugins sont dans le sous-répertoire "plugins" par rapport au répertoire où l'application sera installée, mais je ne sais pas comment retrouver ce répertoire à partir de mon programme. Si le programme est lancé alors que le répertoire courant est celui où est installée l'application, il n'y auura pas de problème, mais s'il est lancé avec comme répertoire courant un autre répertoire, je ne sais pas comment faire pour retrouver le répertoire d'installation (qui peut varier d'un utilisateur à l'autre).
Je peux éventuellement, dans le programme d'installation écrire dans un fichier de config ou la base de registres (sous win) le chemin du répertoire d'installation, mais s'il y a une solution plus simple...

« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas
. »
BiHi Le 16/05/2005 à 19:00Edité par BiHi le 16/05/2005 à 19:07 Normalement, argv[0] contient un chemin vers l'exécutable (au moins relatif).
Ensuite, il ne reste plus qu'à enlever tous les caractères après le dernier '/' (ou '\' sous windows) de la chaîne et tu as un chemin vers le dossier de l'application qui devrait fonctionner avec les fstream, non ?

;)
Hmm, pour une dll c'est plus hardu qu'un *.exe... Je me souviens avoir cherché quelque peu quand j'avais créé ma dll mIRC et je crois qu'après recherches j'avais opté pour la solution "bourrin" -> Tant pis si ça trouve pas.
De plus la méthode doit énormément varier d'un OS a l'autre ^^
Sous windows je crois que tu pourrais regarder la fonction FinFile/FindFileEx (si c'est bien comme ça qu'elle s'apelle, j'arrive plus a la retrouver)
BiHi> sur les windows qui n'utilisent pas DOS il faut aussi rechercher dans le PATH...
hmm sinon j'ai ca dans GTC mais c'est tres incomplet (par exemple sous Unix on peut avoir un PATH sous la forme /bin:/usr/bin/:"/ceci/est/un:chemin/avec/des/deux:points":/usr/loca/bin, mais j'ai pas géré le cas ou les : sont dans des guillemets et tous les trucs d'échappement qu'il faut quand il y a des guillemets; ou sous Windows on peut avoir des / ou \ en tant que séparateur dans argv[0], mais seul le \ est parsé), donc je sais pas si ca t'intéresse ou pas...
« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)
Merci pour vos réponses. Je cherche une solution la plus portable possible, au fait j'utilise Qt, peut-être qu'il y a déjà quelque chose qui permet récupérer ça facilement avec Qt ?

« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas
. »
nitro> Ta solution marche-t-elle sur tous les systèmes unix ? (par exemple MacOS X)

« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas
. »
Oué, ben en fait ce que fait Qt sous *nix, c'est la bidouille avec argv[0]
Sous windows, il me semble que Qt utilise GetModuleFilename ou une fonction du genre (dsl ça commence à dater la dernière fois que j'ai codé sous dows)
J'ai réussi à compiler mon fichier c++ en une DLL grâce à la doc de MSDN, mais maintenant quand j'essaie de la charger, je vérifie préalablement qu'elle exporte bien les fonctions prévues, et je ne les trouve pas !
J'utilise l'API QLibrary de Qt, qui ne me permet pas de svaoir quels sont les symboles exportés, mais seulement de savoir si tel symbole est exporté. Moi j'aimerais savoir quels symboles sont exportés par ma DLL, afin de voir où se situe mon problème. Pouvez-vous m'aider ?

« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas
. »
Merci à vous.
J'ai regardé avec Dependency Walker, et il semble que mes symboles sont bien exportés (et je les exporte "en C" donc, ils ne sont pas décorés). Je ne sais donc pas d'où vient mon problème. Je trouverai bien...

« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas
. »
Link Le 06/06/2005 à 23:28 Euh... En C sous Windows, le symbole a au moins une décoration, le _ qui le précède...
Et si les fonctions sont en __stdcall (comme les fonctions avec le modificateur WINAPI ou CALLBACK), il y a en plus derrière un @ et la taille totale en octets des prarmètres...
Un bon moyen sous VC++ est de cocher l'option du projet "generate mapfile" (elle doit être dans l'onglet Link), puis en ouvrant le fichier .map, tu auras tous les noms de fonctions C.

Maintenant j'ai la flemme de garder une signature à jour sur ce site. Je n'ai même plus ma chaîne Exec sous la main.