 ** EXPORTACIÓN DE DATOS EN UNA DLL DE eDIV **

POR HACER: Cómo utilizar datos declarados en otras DLLs

En DIV 1 y 2 existen los llamados "objetos predefinidos". Estos objetos
se declaran en el archivo LTOBJ.DEF, y hacen alusión a los datos que 
más tarde manejará la librería DIV32RUN.DLL.

En eDIV no existen objetos predefinidos, ya que absolutamente todas las
funciones se tratan como externas, en DLLs independientes, es decir, 
no hay una librería omnipresente como la DIV32RUN.DLL.

Como es de todos sabido, desde una DLL para DIV 1 ó 2 se pueden exportar
funciones, indicándolo con la función COM_Export, que se llama desde
divmain. Ambas están declaradas en el fichero DIV.H.

En eDIV existe un equivalente del DIV.H, es el EXPORT.H, aunque las
funciones y datos que pone a disposición de la DLL son más numerosos,
ya que en eDIV necesitamos una total funcionalidad para las DLLs. Por 
tanto, el equivalente de divmain es ExportaFuncs, y el de COM_Export es
EDIV_Export, pero no nos quedamos ahí, ya que para cubrir los objetos
predefinidos de DIV necesitamos exportar muchos tipos de datos: 
EDIV_Export_Const, EDIV_Export_Global, etc.

Como los nombres de las funciones resultaron muy largos, hemos incluido
en EXPORT.H una serie de #defines que hacen que la declaración de datos
a exportar sea más cómoda, y de paso más parecida a la sintaxis que se 
utiliza en el LTOBJ.DEF o en el propio DIV.

A continuación damos una descripción de las sentencias que hay que utilizar en la función
ExportaFuncs para exportar objetos:


DECLARACIÓN DE FUNCIONES
--------------------------

Las funciones pueden retornar tanto ints como cadenas (dependiendo de cómo se interprete).
Los parámetros, de igual forma, también pueden ser ints o cadenas.

* FUNCTION

Sintaxis: FUNCTION ( "nombre_funcion", n_parametros, nombre_interno ) ;

Equivalente a: Function nombre_funcion(n_parametros);

"nombre_funcion" es el nombre que la función tendrá dentro de eDIV.
n_parametros es el número de parámetros de la función.
nombre_interno es el nombre que tiene la función dentro del código fuente de la DLL.

Ejemplo: FUNCTION ("load_map",1,DIV_Load_Map);


 DECLARACIÓN DE CONSTANTES
---------------------------

Las constantes sólo pueden ser de tipo int.

* CONST

Sintaxis: CONST ( "nombre", valor ) ;

Equivalente a: Const nombre=valor;

"nombre" es el nombre que tendrá la constante dentro de eDIV.
valor es el valor que tendrá la constante.

Ejemplo: CONST ("m320x200",320200);



 DECLARACIÓN DE DATOS GLOBALES
-------------------------------

* GLOBAL

Exporta una variable global. Sólo pueden ser de tipo int.

Sintaxis: GLOBAL ("nombre", valor ) ;

Equivalente a: Global nombre(=valor);

"nombre" es el nombre que tendrá la variable dentro de eDIV.
valor es el valor que tendrá por defecto la variable.

Ejemplo: GLOBAL ("max_process_time",500);


* GLOBAL_ARRAY

Exporta un array (tabla) global. Sólo pueden ser de tipo int (o punteros a char).
No se puede inicializar la tabla. Todos sus registros serán automáticamente inicializados a 0 (aunque se puede modificar después).
Desde eDIV, siempre se podrá acceder al primer registro de la tabla escribiendo simplemente el nombre, o bien nombre[0]

Sintaxis: GLOBAL_ARRAY ( "nombre", numero_de_registros ) ;

Equivalente a: Global nombre[numero_de_registros];

"nombre" es el nombre que tendrá la tabla dentro de eDIV.
numero_de_registros es el número de registros de la tabla.

Ejemplo: GLOBAL_ARRAY ("timer",9);

* GLOBAL_STRUCT

Exporta una estructura o tabla de estructuras global.
Al igual que en las tablas de int, desde eDIV siempre se podrá acceder a la primera estructura de la tabla escribiendo simplemente el nombre, o bien nombre[0]

Sintaxis: GLOBAL_STRUCT ( "nombre", numero_de_registros ) ;

              // Declaraciones de miembros (ver más abajo)

          END_STRUCT ;

Equivalente a: Global Struct nombre[numero_de_registros]
                   // declaraciones
               End

"nombre" es el nombre de la estructura dentro de eDIV.
numero_de_registros es el número de registros de la tabla de estructuras, o bien 0 para que sea un único registro.

Ejemplo: GLOBAL_STRUCT ("video_modes",31);
             _INT("wide",0);
             _INT("height",0);
             _INT("mode",0);
         END_STRUCT;



 DECLARACIÓN DE DATOS LOCALES
-------------------------------

* LOCAL

Exporta una variable local. Sólo pueden ser de tipo int.

Sintaxis: LOCAL ("nombre", valor ) ;

Equivalente a: Local nombre(=valor);

"nombre" es el nombre que tendrá la variable dentro de eDIV.
valor es el valor que tendrá por defecto la variable en todos los procesos.

Ejemplo: LOCAL ("graph",0);


* LOCAL_ARRAY

Exporta un array (tabla) local. Sólo pueden ser de tipo int (o punteros a char).
No se puede inicializar la tabla. Todos sus registros serán automáticamente inicializados a 0 (aunque se puede modificar después).
Desde eDIV, siempre se podrá acceder al primer registro de la tabla escribiendo simplemente el nombre, o bien nombre[0]

NOTA: ESTE TIPO DE DATOS NO SE UTILIZA (DE FORMA PREDEFINIDA) EN DIV2. Lo hemos incluido en eDIV por su posible utilidad en DLLs personalizadas.

Sintaxis: LOCAL_ARRAY ( "nombre", numero_de_registros ) ;

Equivalente a: Local nombre[numero_de_registros];

"nombre" es el nombre que tendrá la tabla dentro de eDIV.
numero_de_registros es el número de registros de la tabla.


* LOCAL_STRUCT

Exporta una estructura o tabla de estructuras local.
Al igual que en las tablas de int, desde eDIV siempre se podrá acceder a la primera estructura de la tabla escribiendo simplemente el nombre, o bien nombre[0]

Sintaxis: LOCAL_STRUCT ( "nombre", numero_de_registros ) ;

              // Declaraciones de miembros (ver más abajo)

          END_STRUCT ;

Equivalente a: Local Struct nombre[numero_de_registros]
                   // declaraciones
               End

"nombre" es el nombre de la estructura dentro de eDIV.
numero_de_registros es el número de registros de la tabla de estructuras, o bien 0 para que sea un único registro.

Ejemplo: LOCAL_STRUCT ("reserved",0);
             _INT("process_id",0);
             _INT("id_scan",0);
             _INT("process_type",0);
             _INT("type_scan",0);
             // etc etc etc
         END_STRUCT;



 DECLARACIÓN DE MIEMBROS DE ESTRUCTURAS
----------------------------------------

Las declaraciones de estructuras dentro del código fuente de la DLL funcionan como bloques, parecido a como se declaran las estructuras en DIV.

* _INT

Declara un miembro de tipo int.

Sintaxis: _INT ( "nombre", valor ) ;

Equivalente a: Int nombre(=valor);

"nombre" es el nombre del miembro de la estructura, dentro de eDIV.
valor es el valor que el miembro toma por defecto en la estructura. Si la estructura tiene varios registros (es decir, si es una tabla de estructuras), el miembro será inicializado con ese valor en todos los registros de la tabla.

Ejemplo: _INT("distance",64);


* _STRING

Declara un miembro de tipo string.

Sintaxis: _STRING ( "nombre", tamaño ) ;

Equivalente a: String nombre[tamaño];

"nombre" es el nombre del miembro de la estructura, dentro de eDIV.
tamaño es el tamaño máximo que se reservará para la cadena.

Ejemplo: _STRING("fullpath",254);


* _ARRAY

Declara un miembro como tabla de ints o punteros a char.
No se puede inicializar la tabla. Todos sus registros serán automáticamente inicializados a 0, en todos los registros de la estructura de la que es miembro (aunque esto se puede modificar después).
Desde eDIV, siempre se podrá acceder al primer registro de la tabla escribiendo simplemente el nombre, o bien nombre[0]

Sintaxis: _ARRAY ( "nombre", numero_de_registros ) ;

Equivalente a: Int nombre[numero_de_registros];

"nombre" es el nombre del miembro de la estructura, dentro de eDIV.
numero_de_registros es el número de registros de la tabla.

Ejemplo: _ARRAY("name",1024);



(c) Sion Entertainment, 2001
Redactado por Er_Makina (makinatotal@yahoo.es)
Este documento pertenece al proyecto eDIV SDK