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.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++
FoxPress – Octubre de 2001
© 2001 FoxPress. All rights reserved