load      Commandes Internes Tcl


NOM

load - Charge du code machine et initialise de nouvelles commandes.

SYNTAXE

load fileName
load fileName packageName
load fileName packageName interp

DESCRIPTION

Cette commande charge du code binaire à partir d'un fichier dans l'espace d'adressage de l'application et appelle une fonction d'initialisation dans le package pour l'incorporer dans un interpréteur. fileName est le nom du fichier contenant le code sa forme exacte varie d'un système à l'autre mais le plus souvent c'est une bibliothèque partagée, tel un fichier.so sous Solaris ou une DLL sous Windows. packageName est le nom du package, et est utilisé pour calculer le nom d'une fonction d'initialisation. interp est le nom du chemin de l'interpréteur dans lequel charger le package (voyez la page de manuel interp pour les détails); si interp est omis, il devient l'interpréteur dans lequel la commande load a été appelée.
Une fois le fichier chargé dans l'espace d'adressage de l'application, une des deux fonction d'initialisations sera appelée dans le nouveau code. Typiquement la fonction d'initialisation ajoute de nouvelles commandes à un interpréteur Tcl. Le nom de la fonction d'initialisation est déterminé par packageName et si le l'interpréteur cible est sùr ou non Pour les interpréteurs normaux le nom de la fonction d'initialisation aura le forme pkg_Init, où pkg est le même que packageName excepté que la première lettre est convertie en majuscule et tout autre lettres sont converti en minuscule Par exemple, si packageName est foo ou FOo, le nom de la fonction d'initialisation sera Foo_Init.
Si l'interpréteur cible est un interpréteur sùr, alors le nom de la fonction d'initialisation sera pkg_SafeInit au lieu de of pkg_Init. La fonction pkg_SafeInit sera écrite soigneusement, ainsi elle initialisera l'interpréteur sùr avec seulement les fonctionalités fournies par le package sécurisé pour être utilisé par du code inconnu. Pour plus information sur Safe-Tcl, voyez la page de manuel safe.
La fonction d'initialisation doit correspondre au prototype suivant:
typedef int Tcl_PackageInitProc(Tcl_Interp *interp);
L'argument interp identifie l'interpréteur dans lequel le package est chargé La fonction d'initialisation retourne TCL_OK ou TCL_ERROR pour indiquer si oui ou non elle s'est complétée avec succès; dans le cas d'une erreur elle doit fixer le résultat de l'interpréteur à pointer vers un message d'erreur. Le résultat de la commande load sera le résultat renvoyé par la fonction d'initialisation.
Le chargement d'un fichier doit être fait seulement une fois pour chaque fileName dans une application. Si un fileName donné est chargé dans plusieurs interpréteurs, alors le premier load chargera le code et appellera la fonction d'initialisation; le suivant load appelera la fonction d'initialisation sans recharger le code. Il n'est pas possible de décharger ou recharger un package.
La commande load supporte aussi les packages statiquement liés à l'application, si ces packages ont été declarés en appelant la fonction Tcl_StaticPackage. Si fileName est une chaîne vide, alors packageName doit être spécifié.
Si packageName est omis ou spécifié comme chaîne vide, Tcl essaie de deviner le nom du package. Ceci peut être fait différemment sur différentes plateformes. La méthode divinatoire par défaut, qui est utilisé sur plusieurs plateformes UNIX, est de prendre le dernier élément de fileName, enlever les premier trois caractères si ils sont lib, et utiliser tout caractères suivants alphabétiques et underline comme le nom du module. Par exemple, la commande load libxyz4.2.so utilise le nom de module xyz et la commande load bin/last.so {} utilise le nom de module last.
Si fileName est une chaîne vide, alors packageName doit être spécifié. La commande load recherche en premier un package chargé statiquement (qui a été declaré en appelant la fonction Tcl_StaticPackage) par son nom; s'il en trouve un, il est utilisé. Autrement, la commande load recherche un package chargé dynamiquement par son nom, et l'utilise si trouvé Si plusieurs fichiers différents ont été loaded avec différentes versions du package, Tcl prend le fichier qui a été chargé en premier

PROBLEMES DE PORTABILITE

Windows
Quand un load échoue avec une erreur "library not found", il est aussi possible qu'une n'ait été trouvée Pour voir les bibliothèque dépendante, tapez "dumpbin -imports <dllname>" dans une console DOS pour voir les import de la bibliothèque. Quand vous chargez une DLL dans le répertoire courant, Windows ignorera "./" comme spécificateur de chemin et utilisera une recherche heuristique pour trouver la DLL. Pour éviter cela, chargez la DLL avec
    load [file join [pwd] mylib.DLL]
BUGS

Si le même fichier est loadé par différent fileNames, il sera chargé plusieurs fois dans l'espace d'adressage du processus . Ce comportement peut varier d'un système à un autre (certains systèmes peuvent detecter le chargement redondant, d'autres non)

VOIR EGALEMENT

info sharedlibextension, Tcl_StaticPackage, sùr(n)

Dernière révision: 7.5


Index  Précédent  Suivant