Librerías C++ built-in TOL de enlace dinámico
Las librerías de enlace dinámico en TOL permiten la carga de objetos y funciones creados en C++ para implementar tareas específicas que resulten demasiado lentas en TOL y no sean lo suficientemente generalizables como para formar parte de las utilidades globales del núcleo de TOL.
Carga de librerías C++ built-in TOL
La función built-in de TOL
NameBlock LoadDynLib(Text libraryPath)
devuelve un NameBlock métodos y miembros escritos en C++ en una librería previamente compilada para su enlace dinámico. Una vez cargado el Nameblock no tiene nada de particular y puede ser usado como cualquier otro creado en el propio lenguaje TOL.
Uso de librerías C++ built-in TOL dentro de paquetes
No es posible crear un paquete de forma directa pero sí se puede usar como un miembro dentro de un paquete, adjuntándolo como recurso externo e incluyendo la llamada dentro del método StartActions.
NameBlock MyPackage = [[ ... //At creation time is initialized as trivial NameBlock NameBlock Tools = [[ Real _unused]]; ... Set _.autodoc.nonTolResources = { [[ Set lin32_x86 = { [[ Text so="cpp/Linux-x86_32/libMyTools.so" ]] }, Set lin64_x86 = { [[ Text so="cpp/Linux-x86_64/libMyTools.so" ]] }, Set win32_x86 = { [[ Text dll="cpp/Windows-x86_32/libMyTools.dll" ]] }, Set win64_x86 = { [[ Text dll="cpp/Windows-x86_64/libMyTools.dll" ]] } ]] } ... Real StartActions(Real void) { NameBlock Tools := LoadDynLib("cpp/"+GetHardSoftPlattform(0)+"/libMyTools."+GetSharedLibExt(0)); ... }; ]];
Creación de librerías C++ built-in TOL
Las macros de creación de operadores y las sentencias usadas en el código C++ de TOL para la creación de variables están pensadas para generarlo todo en el ámbito global pero este tipo de librerías deben restringirse a un uso local, por lo que es necesario hacer algún trabajo previo que indique al sistema lo que debe hacer.
La existencia de la macro LOCAL_NAMEBLOCK indicará a la macro de definición de métodos
DefExtOpr
que se encuentran en un ámbito local correspondiente al NameBlock
especificado como _local_nameblock_. Por lo tanto, debe llamarse antes de hacer la
inclusión de las mismas. Como sólo es una macro no es necesario que la variable C++
_local_nameblock_ exista de antemano, basta con que exista antes de llamar a la macro
DefExtOpr
.
La macro de creación de miembros DeclareLocalMember
se encarga de crear la
variable TOL y de añadirla al NameBlock _local_nameblock_.
Los métodos sólo necesitan llamar cuál es el NameBlock al que pertenecen para acceder al resto de métodos y miembros.
El siguiente código puede servir de plantilla para la creación de estas librerías
/* TOL Dynamic Library <NAME>.cpp Purpose: ... */ //Starts local namebock scope #define LOCAL_NAMEBLOCK _local_nameblock_ #include <tol/tol_bnameblock.h> ... #include ... //Creates local nameblock container static BUserNameBlock* _local_unb_ = NewUserNameBlock(); //Creates the reference to local nameblock static BNameBlock& _local_nameblock_ = _local_unb_->Contens(); //Entry point of library returns the NameBlock to LoadDynLib //This is the only one exported function extern "C" { void* GetDynLibNameBlock<NAME>() { return(_local_unb_); } } //Member declaration DeclareLocalMember(TYPE, MEMBER_NAME, MEMBER_DESCRIPTION, MEMBER); //External operator declaration DeclareContensClass(ANY , BTMPCLASS, BCONTENSCLASS) DefExtOpr(ORD,BCONTENSCLASS,NAME,MINARG,MAXARG,LISTGRA,LISTARGS,DES,CL) void BCONTENSCLASS::CalcContens() { TYPE aux = MEMBER_NAME; ... }