Crear una biblioteca FLL básica
Como una biblioteca FLL es esencialmente una DLL que llama a la API de Visual FoxPro, puede crear una biblioteca FLL siguiendo los pasos siguientes en el entorno de programación para crear una DLL.
Para crear un proyecto para la biblioteca FLL
- Inicie Microsoft Visual C/C++.
- En el menú Archivo, elija Nuevo.
- En el cuadro de diálogo Nuevo, elija Área de trabajo del proyecto.
- En el cuadro de diálogo Nueva área de trabajo del proyecto, especifique un nombre de proyecto.
- En la lista Tipo, elija Biblioteca de vínculos dinámicos (DLL).
Después de crear la estructura de la DLL básica, agregue las funciones que desee llamar desde Visual FoxPro. Las siguientes secciones proporcionan estructuras para crear funciones en C y C++.
Establecer una plantilla de biblioteca
Cada biblioteca de funciones que cree tiene la misma estructura básica. Si utiliza una plantilla para la estructura, lo único que tiene que hacer es rellenar los espacios en blanco apropiados para su rutina de biblioteca específica.
Hay cinco elementos en un plantilla de biblioteca de Visual FoxPro:
- Instrucción
#include
- Definición de función
- Código de función
- Estructura FoxInfo
- Estructura FoxTable
Una plantilla de ejemplo en C
Puede usar la siguiente plantilla para crear bibliotecas escritas en C:
#include <Pro_ext.h>
void Internal_Name(ParamBlk *parm)
{
// function code goes here.
}
FoxInfo myFoxInfo[] = {
{"FUNC_NAME", (FPFI) Internal_Name, 0, ""},
};
FoxTable _FoxTable = {
(FoxTable *)0, sizeof(myFoxInfo)/sizeof(FoxInfo), myFoxInfo
};
Una plantilla de ejemplo en C++
Para rutinas en C++, puede usar la siguiente plantilla. Esta plantilla se diferencia de la plantilla en C porque declara la estructura FoxTable
como externa:
#include <Pro_ext.h>
void Internal_Name(ParamBlk *parm)
{
// function code goes here.
}
FoxInfo myFoxInfo[] = {
{"FUNC_NAME", (FPFI) Internal_Name, 0, ""},
};
extern "C" {
FoxTable _FoxTable = {
(FoxTable *)0, sizeof(myFoxInfo)/sizeof(FoxInfo), myFoxInfo
};
}
Usar la plantilla
Para usar el archivo de encabezado y crear una biblioteca compilada, necesita:
- El archivo de encabezado Pro_ext.h. Puede imprimir este archivo para ver las declaraciones de función, definiciones de tipos y estructuras utilizadas en la API de Visual FoxPro.
- El archivo Winapims.lib.
Estos dos archivos se instalan en el subdirectorio API cuando instala Visual FoxPro.
La definición de función devuelve void
y espera el siguiente parámetro: ParamBlk *parm
. La estructura ParamBlk
se trata en Transmitir y recibir parámetros.
Además de los archivos que se han mostrado, los únicos elementos necesarios de una biblioteca de Visual FoxPro son las estructuras FoxInfo y FoxTable.
Usar las estructuras FoxInfo y FoxTable
Las funciones de biblioteca del usuario se comunican con Visual FoxPro a través de la estructura FoxInfo. De esta estructura, Visual FoxPro determina el nombre de función y el número y tipo de parámetros. La estructura FoxTable es una lista vinculada que sigue las estructuras FoxInfo. Vea Pro_ext.h en el directorio API de Visual FoxPro para consultar las definiciones de estructura FoxInfo y FoxTable.
Estructura FoxInfo
La estructura FoxInfo es el vehículo usado para comunicar nombres de funciones y descripciones de parámetros entre Visual FoxPro y la biblioteca del usuario. Una estructura FoxInfo genérica tiene la siguiente apariencia:
FoxInfo arrayname[ ] = {
{funcName1, FPFI function1, parmCount1, parmTypes1}
{funcName2, FPFI function2, parmCount2, parmTypes2}
. . .
{funcNameN, FPFI functionN, parmCountN, parmTypesN}
};
Los marcadores se definen así:
arrayname
Variable de tipo FoxInfo. Observe que puede incluir varias líneas de estructura FoxInfo en esta matriz.funcName
Contiene el nombre (en mayúsculas y longitud máxima de 10 caracteres) que el usuario de Visual FoxPro llama para invocar la función.function
Dirección de la rutina del lenguaje C. Es el nombre exacto (se distingue entre mayúsculas y minúsculas) utilizado para definir la función.parmCount
Especifica el número de parámetros descrito en la cadena parmTypes o uno de los siguientes valores de indicadores.Valor Descripción INTERNAL Especifica que la función no se puede llamar directamente desde Visual FoxPro. CALLONLOAD Especifica que la rutina se va a llamar cuando se cargue la biblioteca. CALLONLOAD no puede llamar a ninguna rutina que devuelva resultados a Visual FoxPro. CALLONUNLOAD Especifica que la rutina se va a llamar cuando la biblioteca se descargue o cuando se ejecute el comando QUIT de Visual FoxPro. CALLONUNLOAD no puede llamar a ninguna rutina que devuelva resultados a Visual FoxPro. parmTypes
Describe el tipo de datos de cada parámetro. La tabla siguiente muestra los valores válidos para parmTypes.Valor Descripción ""
Ningún parámetro "?"
Se puede pasar cualquier tipo. En el cuerpo de la función, tendrá que comprobar el tipo del parámetro pasado "C"
Parámetro de tipo Character "D"
Parámetro de tipo Date "I"
Parámetro de tipo Integer "L"
Parámetro de tipo Logical "N"
Parámetro de tipo Numeric "R"
Referencia "T"
Parámetro de tipo DateTime "Y"
Parámetro de tipo Currency "O"
Parámetro de tipo Object
Incluya un valor de tipo para cada parámetro transferido a la biblioteca. Por ejemplo, si crea una función que acepta un parámetro de tipo Character y de tipo Numeric, sustituya parmType por "CN".
Nota Para indicar que un parámetro es opcional, ponga como prefijo un punto. Sólo se pueden omitir los parámetros finales.
La siguiente estructura FoxInfo
define una biblioteca con una función (llamada internamente dates
y a la que se tiene acceso externo como DATES
) que acepta un parámetro de tipo Character:
FoxInfo myFoxInfo[] = {
{ "DATES", (FPFI) dates, 1, "C" }
};
Cuando haya compilado la biblioteca con esta estructura FoxInfo y la haya cargado en Visual FoxPro con el comando SET LIBRARY TO, puede llamar a esta función en Visual FoxPro con la siguiente línea de código:
=DATES("01/01/95")
Estructura FoxTable
La estructura FoxTable es una lista vinculada que hace un seguimiento de todas las estructuras FoxInfo que tiene para una biblioteca determinada:
FoxTable _FoxTable = {nextLibrary, infoCount,infoPtr};
siendo la definición de los indicadores la siguiente:
- nextLibrary
Un puntero usado internamente por Visual FoxPro; se debe inicializar en 0. - infoCount
El número de rutinas externas de Visual FoxPro definidas en esta biblioteca. - infoPtr
La dirección del primer elemento de una matriz de estructuras FoxInfo. Este nombre tiene que coincidir con el nombre listado en la instrucción FoxInfo.
A continuación se muestra un ejemplo de instrucción FoxTable. Si su nombre de matriz FoxInfo es myFoxInfo
, nunca tendrá que cambiar esta instrucción:
FoxTable _FoxTable = {
(FoxTable *) 0,
sizeof( myFoxInfo) / sizeof( FoxInfo ),
myFoxInfo
};
Visual FoxPro detecta errores de protección general (General Protection Faults, GPF) en los controles ActiveX situados en un formulario o en instancias de objetos COM creadas en Visual FoxPro. Ahora se trata un GPF de un control ActiveX o de un objeto COM como errores detectables de Visual FoxPro (Error 1440 - El objeto OLE puede estar dañado).
Vea también
Crear un objeto ActiveX básico | Creación de bibliotecas API | Agregar llamadas a la API de Visual FoxPro | Acceso a la API de Visual FoxPro | Ampliar Visual FoxPro con bibliotecas externas | Transmitir y recibir parámetros | SET LIBRARY TO