Por Luis Requesens
copiaArchivos.zip
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.
Escribe el siguiente código dentro de CopiaArchivos.cpp.
#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.fllFileCopyX('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++
FoxPress – Octubre de 2001
© 2001 FoxPress. All rights reserved