Utilisation de DLL`s multiples avec Panoramic

Transcription

Utilisation de DLL`s multiples avec Panoramic
Utilisation de DLL's multiples avec Panoramic !
par Klaus
Les programmes Panoramic peuvent utiliser des DLL's à travers un jeu de commandes
spécifique
D'abord:
·
DLL_on dllfilename
ð
cette commande charge dynamiquement la DLL dllfilename (erreur si une
DLL est déjà chargée)
Ensuite:
·
·
·
·
result% = DLL_call0("dllfunction")
result% = DLL_call1("dllfunction",par1)
...
result% = DLL_call6("dllfunction",par1,par2,par3,par4,par5,par6)
ð
ces fonctions appellent une fonction nommée dllfunction dans la DLL
chargée auparavant, et retournent une valeur entière. Note importante: le nom
dllfunction doit respecter la casse (minuscules/majuscules) du nom de la
fonction souhaitée (Erreur si aucune DLL n'est chargée)
Finalement:
·
DLL_off
ð
cette commande décharge une DLL chargée auparavant (erreur si aucune
DLL n'est chargée)
On voit immédiatement qu'à tout instant, une seule DLL pourra être gérée par Panoramic.
Ainsi, si un programme a besoin de plusieurs DLL's, les commandes DLL_on et DLL_off
doivent être utilisées chaque fois pour changer de DLL.
Techniquement, cela est peut-être acceptable; mais ce n'est pas très efficace, ni en termes de
performance ni en termes d'élégance. Et cela peut même être prohibitif pour l'usage de
certaines fonctions des DLL's. Avec des fonctions DLL, on peut explorer une arborescence de
dossiers, une liste d'objets etc. Toutes ces fonctions API présupposent que le lien entre la DLL
et le programme appelant ne sera pas brisé, sinon, le contexte de la requête sera perdu. Si à ce
moment-là, on a besoin d'une fonction qui réside dans une autre DLL, on est bloqué – il n'y a
aucun moyen de faire cela en Panoramic .
C'est là qu'intervient ma gestion particulière des DLL's !
J'ai écrit une DLL spéciale gérant le chargement dynamique d'autres DLL's, et ce d'une façon
entièrement ignorée par Panoramic ! La seule DLL connue de Panoramic est cette DLL
spéciale, le reste est fait de façon interne ! Et ainsi, la limitation de chargements de DLL's par
Panoramic a disparu !
Cette DLL spéciale est appelée DynamicallyLoadDLL.dll. Comme on est toujours sous
Panoramic, les conventions d'appel de Panoramic s'appliquent. Au lancement du programme,
on charge cette DLL:
DLL_ON "DynamicallyLoadDLL.dll"
A la fin du programme, ne pas oublier de la décharger:
DLL_off
Après chargement de cette DLL, tous les autres appels de fonctions DLL se feront à travers
elle. D'abord, on commence par charger toutes les DLL's qui seront nécessaires à tout instant
donné. Ceci est fait par:
handle_DLL% = dll_call1("LoadDLL", adr(dll_name$))
handle_DLL% est le handle Windows de la DLL chargée dynamiquement. Il faut déclarer une
variable de type entier pour chaque DLL chargée simultanément. Cette variable sera utilisée
pour référencer la DLL ciblée jusqu'à moment de son déchargement. LoadDLL est le nom de
la fonction dans DynamicallyLoadDLL qui fait le travail. dll_name$ est une variable de type
chaîne de caractères contenant le nom de la DLL à charger. Et comme Panoramic ne sait
passer que des valeurs entières par valeur en paramètre, la variable doit être passée par son
adresse physique, ce qui est fait par la fonction adr().
Lorsqu'une DLL chargée de cette manière n'est plus utilisée, il est de la responsabilité du
programme appelant de la décharger proprement. Ne JAMAIS oublier de décharger une DLL
chargée ! Ceci est fait par:
result% = dll_call1("UnLoadDLL", handle_DLLl%)
result% est la valeur résultante de la fonction qui est sans signification dans ce cas.
handle_DLL% est le handle de la DLL retourné par la fonction LoadDLL.
Maintenant, il y a un problème. Panoramic appelle les fonctions DLL par ses fonctions
DLL_callx, où x est le nombre de paramètres à passer à l'exécution. Le nombre maximum de
paramètres à passer est 6, plus le nom de la fonction à appeler. Mais dans le cas de DLL's
multiples, la DLL doit être identifiée également. Et la fonction d'appel DynamicallyLoadDLL
doit être précisée également, utilisant ainsi 2 des paramètres disponibles ! Ce conflit est résolu
par une fonction spécifique pour "cibler" la DLL choisie, ainsi que le nom de la fonction à
exécuter dans cette DLL. DynamicallyLoadDLL mémorisera en interne le nom de la fonction
visée. On peut maintenant utiliser la fonction d'appel de DynamicallyLoadDLL qui est plus ou
moins une enveloppe (wrapper) autour des fonctions DLL_callx de Panoramic.
Le ciblage est fait par:
result% = dll_call2("TargetDLL", handle_DLL%, adr(funct$))
result% est la valeur résultante de la fonction qui est sans signification dans ce cas.
handle_DLL% est le handle de la DLL retourné par la fonction LoadDLL. funct$ est une
chaîne de caractères contenant le nom de la fonction visée. Important: le nom de la fonction
DOIT être dans une variable de type chaîne de caractères et doit être passé par adr().
La fonction visée est appelée par:
result%
result%
result%
result%
result%
result%
result%
=
=
=
=
=
=
=
dll_call0("CallDLL0")
dll_call1("CallDLL1",p1)
dll_call2("CallDLL2",p1,p2)
dll_call3("CallDLL3",p1,p2,p3)
dll_call4("CallDLL4",p1,p2,p3,p4)
dll_call5("CallDLL5",p1,p2,p3,p4,p5)
dll_call6("CallDLL6",p1,p2,p3,p4,p5,p6)
result% est le résultat de la fonction exécutée. p1...p6 sont les paramètres passés à la
function.
Note: les fonctions appelées par Panoramic sont CallDLLx qui sont des fonctions d'enveloppe
qui résident dans DynamicallyLoadedDLL.dll. Ces fonctions vont appeler la dernière
fonction ciblée, en utilisant les paramètres actuels.
Les restrictions de Panoramic sont ainsi dépassées par l'utilisation de cette technique.
La distribution contient d'autres DLL's, ainsi qu'une documentation complète et des
programmes de démo, en particulier le programme"Test DynamicallyLoadDLL.bas" qui
montre les possibilités de ce module. La distribution est accessible via le lien suivant:
http://klauspanoramic.funpic.org/files/DLLdivers.42.zip
ou sur ma page internet:
http://klauspanoramic.funpic.org/index.html
Comme tous les autres programmes proposés sur mon site internet, ce module est un
gratuiciel intégral; des sources sont distribuées ou peuvent être obtenues gratuitement auprès
de l'auteur.
Note d'implémentation: les fonctions de gestion de DLL's dynamiques ont été intégrées
également dans KGF.dll qui est une grosse DLL contenant des centaines de fonctions
d'extension pour Panoramic.
NOTE IMPORTANTE: TOUJOURS DECHARGER UNE DLL CHARGEE
DYNAMIQUEMENT LORSQU'ELLE N'EST PLUS NECESSAIRE !

Documents pareils