[[PageOutline]] = 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 {{{ #!cpp /* TOL Dynamic Library .cpp Purpose: ... */ //Starts local namebock scope #define LOCAL_NAMEBLOCK _local_nameblock_ #include ... #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() { 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; ... } }}}