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++


 



error: Contenido protegido