Cómo hacer una .FLL (guía para torpes)
05/03/2020
Fox desde la versión 2.0 tiene la posibilidad de hacer librerías PLB (entorno DOS) y FLL (entorno Windows). Estas librerías te permiten realizar operaciones de más bajo nivel que de otra forma no podrías. Te pongo una guía ‘paso a paso’ para poder hacer tu primera .FLL útil.
Usaremos Visual C++ 6.0
- Copia los ficheros PRO_EXT.H que lo tendrás dentro del directorio API de instalación de Fox en el directorio Include del directorio de instalación de VC++ .
- Copia el difichero WinApims.lib que lo tendrás dentro del directorio API de Fox al directorio lib de Visual C++.
- Lanza VC++ y pulsa en File/New.
.
- Selecciona dentro de la pestaña de proyectos la opción Win32 Dynamic Link Library y dejala marcada.
- En location pon el nombre del directorio donde vas a realizar tu primera .FLL. El directorio debe ya de existir. Por ejemplo: c:\CopiaArchivos.
- En Project name escribe CopiaArchivos.
- La opción de ‘Create new workspace’ se debe quedar como marcada por defecto.
- Pulsa en Aceptar y se te abre otra ventana en el que te pregunta qué tipo de DLL quieres crear.
- Deja marcada la opción de an empty DLL project. Pulsa en Finalizar. Y dale OK a lo que te diga.
- Escoje ahora File\new. Dentro de la pestaña de Files escoje C++ source file y pon en file name CopiaArchivos (la opción de Add to project debe estar marcada por defecto).
- Escoje ahora Project\Settings y pulsa en la pestaña de C++ . Pon la opción de Category Code a generation.
- La opción de Calling convention : _fastcall
- La opción de Use runtime lib : Multithreaded DLL
- Pulsa la pestaña de Link y pon delante de todos los Object/library modules :winapims.lib. El resto de las opciones déjalas como están.
- Pulsa OK y cierra el Project/Settings
#include < windows.h >
#include < stdio.h >
#include < pro_ext.h >char FAR *NullTerminate(Value FAR *cVal
{
char *RetVal;
if (!_SetHandSize(cVal->ev_handle, cVal->ev_length + 1))
{
_Error(182); // "Insuficiente Memoria"
}
((char FAR *) _HandToPtr(cVal->ev_handle))[cVal->ev_length] = '\0';
RetVal = (char FAR *) _HandToPtr(cVal->ev_handle);
return RetVal;
}
void FAR FileOp(ParamBlk FAR *parm)
{
SHFILEOPSTRUCT ShCopyInfo;
ZeroMemory(&ShCopyInfo, sizeof (SHFILEOPSTRUCT));
char FAR *source = NullTerminate(&parm->p[0].val);
char FAR *target = NullTerminate(&parm->p[1].val);
ShCopyInfo.hwnd = GetActiveWindow();
ShCopyInfo.pFrom=source;
ShCopyInfo.pTo=target;
ShCopyInfo.wFunc=FO_COPY;
ShCopyInfo.fFlags=FOF_NOCONFIRMATION + FOF_NOCONFIRMMKDIR;
int success = SHFileOperation(&ShCopyInfo);
_RetInt(success,10);
}
FoxInfo myFoxInfo[] =
{
{"FileCopyX", (FPFI) FileOp, 2, "CC"},
};
extern "C" {
FoxTable _FoxTable =
{
(FoxTable *) 0, sizeof(myFoxInfo)/sizeof(FoxInfo), myFoxInfo
};
}
- Pulsa F7 (tecla rápida para compilar)
- Vete al directorio CopiaArchivo\Debug\ y cambia la extensión de CopiaArchivo.DLL a CopiaArchivo.fll
En Fox escribe:
set library to C:\temp\filecopier\Debug\filecopier.fll
FileCopyX('c:\dir1\*.*','c:\dir2')El directorio origen debe de existir. Esto te produce un sistema de copiar archivos con estilo an explorer (con animación y barra de progreso).
Ya ves que no es tan dificil. Lo que hay que saber es C++
Referencias
FoxPress: Cómo hacer una .FLL (guía para torpes)