275 lines
8.7 KiB
Plaintext
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 |