| Version 7 (modified by , 15 years ago) (diff) |
|---|
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_ = new BGraContensP<BNameBlock>("", new BNameBlock);
//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;
...
}
