edivc/ediv/doc/ExportaFuncs.txt
2002-09-25 23:50:51 +00:00

275 lines
8.7 KiB
Plaintext

** 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);
(020926): Se puede sobrecargar una función declarándola varias veces con distinto
número de parámetros (da igual si se indica un puntero a una función de C distinta o
no). A cada declaración se le asignará un id distinto, como si fueran funciones dis-
tintas. Dentro de la función se puede saber cuántos parámetros se han recibido con
fp->num_params.
Ejemplo:
FUNCTION ("set_mode",1,DIV_Set_Mode);
FUNCTION ("set_mode",3,DIV_Set_Mode);
FUNCTION ("set_mode",4,DIV_Set_Mode);
...
int DIV_Set_Mode(FUNCTION_PARAMS)
{
int modo,ancho,alto,bpp,flags;
switch(fp->num_params) {
case 1:
modo=getparm();
...
case 3:
bpp=getparm();
alto=getparm();
ancho=getparm();
...
case 4:
flags=getparm();
bpp=getparm();
alto=getparm();
ancho=getparm();
...
}
return 0;
}
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