close Warning: Can't synchronize with repository "(default)" (/var/svn/tolp does not appear to be a Subversion repository.). Look in the Trac log for more information.

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;
  ...
}



Last modified 14 years ago Last modified on Aug 4, 2010, 11:35:15 AM