Appel à des fonctions extérieures non connues à l'avance

elixir2 Messages postés 10 Date d'inscription mardi 9 décembre 2003 Statut Membre Dernière intervention 29 janvier 2004 - 27 janv. 2004 à 18:18
elixir2 Messages postés 10 Date d'inscription mardi 9 décembre 2003 Statut Membre Dernière intervention 29 janvier 2004 - 29 janv. 2004 à 11:26
Bonjour, j'ai un petit souci. Quelle méthode peut-on utiliser pour appeler des fonctions extérieures à un programme (exemple calcule_carre()) sans connaitre la fonction à l'avance.

Mon application gère une base de données de paramètres numériques. Ces paramètres numériques peuvent être traités par des formules mathématiques compliquées connues seulement de l'utilisateur. J'esperai pouvoir traiter le problème en disant au client qu'il n'avait qu'à compiler ses formules dans une dll et indiquer quelle formule doit être utilisée par mon application (qui listerait les formules disponibles dans une combobox) pour traiter tel ou tel paramètre. Le problème c'est que l'utilisation d'une dll nécessite de déclarer à l'avance les prototypes des fonctions à la compilation.

Schéma:
1. choisir parametre1
2. choisir parametre2
3. Liste des formules disponibles dans le module extérieur
4. Utilisation de la formule calcul1 qui se trouve dans le module extérieur (via adresse de la fonction)

Si quelqu'un a une idée je suis preneur.

10 réponses

cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
27 janv. 2004 à 19:14
tu connai le nombre de parametres, leur type et le type retour?
0
elixir2 Messages postés 10 Date d'inscription mardi 9 décembre 2003 Statut Membre Dernière intervention 29 janvier 2004
28 janv. 2004 à 11:56
J'essaie déjà de résoudre le problème pour 2 paramètres flottants, retour flottant.

float calcul(float& param1, float& param2);
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
28 janv. 2004 à 18:17
je suis pas sur mais tu sera bien obliger de lui dire avant compilation quelle fonction tu importe a partir de quelle dll
0
elixir2 Messages postés 10 Date d'inscription mardi 9 décembre 2003 Statut Membre Dernière intervention 29 janvier 2004
28 janv. 2004 à 18:31
Non ce n'est pas nécessaire si tu utilises GetProcAddress.

Func1 = (lpFunc1) GetProcAddress((HINSTANCE)hModDll, "NomDeLaFonctionDansLaDLL");
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
28 janv. 2004 à 18:41
ok, elle fait koi cette fonction?

et ca peut pas resoudre ton probleme ca?
0
elixir2 Messages postés 10 Date d'inscription mardi 9 décembre 2003 Statut Membre Dernière intervention 29 janvier 2004
28 janv. 2004 à 19:14
Oui en partie, mais je ne sais pas comment lister les fonctions exportées présentes dans une dll.

Func1 = (lpFunc1) GetProcAddress((HINSTANCE)hModDll, "NomDeLaFonctionDansLaDLL");

C'est récupérer NomDeLaFonctionDansLaDLL qui me pose problème.

Et c'est le but de mon post, comment lister toutes les fonctions présentes dans une dll pour en déduire le nom des fonctions.

En fait on a besoin de connaître le nom de la fonction, le typage et le nombre de paramètres.

Le type et le nombre de paramètres étant imposés par mon application ce n'est donc pas un problème. Par contre sauf à demander à l'utilisateur de connaître les noms des fonctions des dll chargées (solution pas vraiment pratique), il faudrait que mon appli lui présente la liste des noms de fonctions présentes.
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
28 janv. 2004 à 19:42
je suis pas sur d'avoir compris mais ca doit pouvoir se gerer avec des pointeurs sur fonction, dans ton cas type

float (*calcul) (float&,float&)

enfin histoire d'avoir un truc de "generique"
0
elixir2 Messages postés 10 Date d'inscription mardi 9 décembre 2003 Statut Membre Dernière intervention 29 janvier 2004
28 janv. 2004 à 20:03
Oui mais pour avoir le pointeur de cette fonction il faut d'abord que j'en connaisse le nom.
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
28 janv. 2004 à 20:10
non,
la je l'ai appelert calcul, mais calcul c'est juste le nom du pointeur apres des que tu connai nom ou l'adresse(avec GetProcAddress) tu fait
calcul=nom_de_ta_fonction; ==>nom_de_ta_fonction=adresse

et tu pourra utiliser calcul comme ta fonction en l'appelant par (*calcul)
0
elixir2 Messages postés 10 Date d'inscription mardi 9 décembre 2003 Statut Membre Dernière intervention 29 janvier 2004
29 janv. 2004 à 11:26
Merci pour ton aide mais ce n'est pas ça le problème.

Pour avoir le pointeur sur une des fonctions contenues dans la dll, il faut effectivement faire appel à GetProcAddress.

Or GetProcAddress nécessite de connaître le nom de la fonction. Le problème c'est que je ne connais pas les noms des fonctions dans la dll puisque ces dll sont construites par les utilisateurs de mon application.

Il faut donc que je trouve un moyen de lister les noms des fonctions disponibles dans la dll AVANT de faire appel à GetProcAddress.

Procédure:
- 1 - Lister les noms des fonctions présentes dans la dll (ce que je ne sais pas faire)
- 2 - Afficher les noms à l'utilisateur pour qu'il choisisse la fonction qu'il souhaite utiliser.
- 3 - Appeler GetProcAdress avec le nom de la fonction choisie pour en obtenir l'adresse.
- 4 - Utiliser la fonction.

Reste à résoudre le - 1 - but de la question ici.
0
Rejoignez-nous