Je fais suite à mon post précédent.
J'ai fait une DLL qui contient deux fonctions: une pour charger dynamiquement une DLL dont je spécifie le chemin, et l'autre pour décharger une DLL chargée par ce moyen.
Je l'ai testé avec un programme Panoramic: ça marche parfaitement, je peux charger dynamiquement plusieurs DLL et les décharger à volonté.
Le problème, c'est que je ne peux appeler aucune des fonctions de ces DLL dynamiques. Seule les fonctions de la DLL chargée par DLL_on sont accessibles (et en occurence, c'est ma DLL utilisée pour charger les autres).
Est-ce que Panoramic teste si la fonction demandée est dans la DLL chargée par DLL_on ? Si oui, pourrait-on avoir un moyen de désactiver ce test, par exemple avec une directive compilateur du type
#DLL_FUNCTION_CHECK ON/OFF
ou une commande équivalente ? Car avec cet apport, j'aurais la solution au problème soulevé dans mon post précédent: je pourrais utiliser simultanément les DLL dont j'ai besoin.
Je sais bien qu'en cas d'erreur, cela peut conduire à un plantage du programme. Mais d'abord, cela peut arriver n'importe quand dans une DLL (en phase de mise au point), et ensuite, rien n'oblige un programmeur à utiliser cette directive (ou commande).
Ce message s'adresse bien sûr à Jack: j'espère que tu pourras trouver une solution à ce problème !
EDIT
La nuit a porté conseil. J'ai étudié plus avant et je me suis rendu compte que ce que je demandais, n'est pas réalisable tel quel, vu la façon à utiliser pour appeler une fonction par son nom dans une DLL chargée dynamiquement.
Il faut en effet connaître le nom de la DLL si elle n'est pas encore chargée, ou le handle de la DLL si elle a déjà été chargée. La solution consisterait peut-être en une nouvelle commande du type
DLL_target_is handle% : ' tous les DLL_xxx agiront sur cette DLL ensuite
ou
DLL_target_is nom_dll$ : ' idem, avec chargement si nécessaire
La deuxième version sera peut-être la plus réaliste.
Dans cette perspective, il serait peut-être intéressant de laisser DLL_on charger une DLL même si une autre a déjà ete chargée. DLL_on exécuterait alors un GLL_target_is implicite sur la DLL qu'elle vient de charger. Le comportement serait alors identique à ce qui se passe maintenant avec une seule DLL, seulement on pourrait basculer facilement d'une DLL à une autre.
En attendant, je développe mon propre dispatcheur utilisant cette idée.