Page 1 of 1

Problema con al descargar un fichero por ftp

Posted: Thu Nov 20, 2008 11:18 am
by Elias Torres
Hola a todos....

Tengo el siguiente codigo en el cual la subida de ficheros al ftp me funciona perfectamente, pero cuando intento descargarme algun fichero, este me lo pone en la pda (procedente del ftp) pero cuando termina la aplicación automáticamente me lo elimina, ¿por que?


El código por si alguien puede echarme una mano es el siguiente:




#include <FWCE.ch>
#include <sql.ch>


&&Codigo de declaración para envío por GPRS

#define FILE_ATTRIBUTE_READONLY 1
#define FILE_ATTRIBUTE_HIDDEN 2
#define FILE_ATTRIBUTE_SYSTEM 4
#define FILE_ATTRIBUTE_DIRECTORY 16
#define FILE_ATTRIBUTE_ARCHIVE 32
#define FILE_ATTRIBUTE_NORMAL 128
#define FILE_ATTRIBUTE_TEMPORARY 256



//
// access types for InternetOpen()
//

#define INTERNET_OPEN_TYPE_PRECONFIG 0 // use registry configuration
#define INTERNET_OPEN_TYPE_DIRECT 1 // direct to net
#define INTERNET_OPEN_TYPE_PROXY 3 // via named proxy
#define INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY 4 // prevent using java/script/INS


//
// manifests
//

#define INTERNET_INVALID_PORT_NUMBER 0 // use the protocol-specific default

#define INTERNET_DEFAULT_FTP_PORT 21 // default for FTP servers
#define INTERNET_DEFAULT_GOPHER_PORT 70 // " " gopher "
#define INTERNET_DEFAULT_HTTP_PORT 80 // " " HTTP "
#define INTERNET_DEFAULT_HTTPS_PORT 443 // " " HTTPS "
#define INTERNET_DEFAULT_SOCKS_PORT 1080 // default for SOCKS firewall servers.


//
// service types for InternetConnect()
//

#define INTERNET_SERVICE_FTP 1
#define INTERNET_SERVICE_GOPHER 2
#define INTERNET_SERVICE_HTTP 3


//
// flags for FTP
//

#define INTERNET_FLAG_TRANSFER_ASCII 1
#define INTERNET_FLAG_TRANSFER_BINARY 2


#pragma BEGINDUMP

#include "windows.h"
#include "wininet.h"
#include "hbapi.h"
#include "initguid.h"
#include "connmgr.h"


LPWSTR AnsiToWide( LPSTR );

HB_FUNC( INTERNETOPEN )
{
LPWSTR cAgent = AnsiToWide( hb_parc( 1 ) );
LPWSTR cProxyName = AnsiToWide( hb_parc( 3 ) );
LPWSTR cProxyBypass = AnsiToWide( hb_parc( 4 ) );

HINTERNET hInternet = InternetOpen( cAgent, hb_parnl( 2 ), cProxyName, cProxyBypass, hb_parnl( 5 ) );

hb_xfree( cAgent );
hb_xfree( cProxyName );
hb_xfree( cProxyBypass );

hb_retnl( ( LONG ) hInternet );
}

HB_FUNC( INTERNETCLOSEHANDLE )
{
hb_retl( InternetCloseHandle( ( HINTERNET ) hb_parnl( 1 ) ) );
}

HB_FUNC( INTERNETCONNECT )
{
LPWSTR cServerName = AnsiToWide( hb_parc( 2 ) );
LPWSTR cUserName = AnsiToWide( hb_parc( 4 ) );
LPWSTR cPassword = AnsiToWide( hb_parc( 5 ) );

HINTERNET hInternet = InternetConnect( ( HINTERNET ) hb_parnl( 1 ), cServerName, ( INTERNET_PORT ) hb_parnl( 3 ), cUserName, cPassword, hb_parnl( 6 ), hb_parnl( 7 ), hb_parnl( 8 ) );

hb_xfree( cServerName );
hb_xfree( cUserName );
hb_xfree( cPassword );

hb_retnl( ( LONG ) hInternet );
}

HB_FUNC( FTPGETFILE )
{
LPWSTR cRemoteFile = AnsiToWide( hb_parc( 2 ) );
LPWSTR cNewFile = AnsiToWide( hb_parc( 3 ) );

hb_retl( FtpGetFile( ( HINTERNET ) hb_parnl( 1 ), cRemoteFile, cNewFile, hb_parl( 4 ), hb_parnl( 5 ), hb_parnl( 6 ), hb_parnl( 7 ) ) );

hb_xfree( cRemoteFile );
hb_xfree( cNewFile );
}

HB_FUNC( FTPPUTFILE )
{
LPWSTR cLocalFile = AnsiToWide( hb_parc( 2 ) );
LPWSTR cNewRemoteFile = AnsiToWide( hb_parc( 3 ) );

hb_retl( FtpPutFile( ( HINTERNET ) hb_parnl( 1 ), cLocalFile, cNewRemoteFile, hb_parnl( 4 ), hb_parnl( 5 ) ) );

hb_xfree( cLocalFile );
hb_xfree( cNewRemoteFile );
}

HB_FUNC (GPRSCONNECT)
{
HANDLE phWebConnection = NULL;
DWORD pdwStatus = 0;
ConnMgrConnectionStatus (phWebConnection, &pdwStatus);
if (pdwStatus == CONNMGR_STATUS_CONNECTED)
{
hb_retnl( (long) 0 );
}
else
{
CONNMGR_CONNECTIONINFO sConInfo;
memset (&sConInfo,0, sizeof (CONNMGR_CONNECTIONINFO));
sConInfo.cbSize = sizeof (CONNMGR_CONNECTIONINFO);
sConInfo.dwParams = CONNMGR_PARAM_GUIDDESTNET;
sConInfo.dwPriority = CONNMGR_PRIORITY_USERINTERACTIVE;
sConInfo.dwFlags = CONNMGR_FLAG_PROXY_HTTP;
sConInfo.bExclusive = TRUE ;
sConInfo.bDisabled = FALSE;
sConInfo.guidDestNet = IID_DestNetInternet;

if (ConnMgrEstablishConnection (&sConInfo, &phWebConnection) == S_OK)
{
unsigned int k;
for (k = 0; k < 8; k ++)
{
ConnMgrConnectionStatus(phWebConnection,&pdwStatus);
if (pdwStatus == CONNMGR_STATUS_CONNECTED)
{
hb_retnl( (long) phWebConnection );
}
if (pdwStatus == CONNMGR_STATUS_CONNECTIONCANCELED || pdwStatus == CONNMGR_STATUS_WAITINGCONNECTIONABORT)
{
hb_retnl( (long) -1 );
}
Sleep (2500);
}
hb_retnl( (long) phWebConnection );
}
else
{
hb_retnl( (long) -1 );
}
}
}
HB_FUNC (GPRSRELEASE)
{
HANDLE hCon= NULL;
ConnMgrReleaseConnection( ( HANDLE ) hb_parnl( 1 ),2 );
}


#pragma ENDDUMP



*********************************************************************
* CUERPO PRINCIPAL *
*********************************************************************
FUNCTION Main()


LOCAL ruta_local,ruta_destino
PUBLIC tipo

DEFINE dialog oWnd resource "FTP"

redefine say id 1000 of oWnd
redefine say id 2000 of oWnd
redefine get oget1 var ruta_local id 110 of oWnd
redefine get oget2 var ruta_destino id 120 of oWnd
redefine button id 100 of oWnd action (tipo:='enviar',envio(tipo))
redefine button id 200 of oWnd action (tipo:='recibir',envio(tipo))

ACTIVATE dialog oWnd


RETURN nil


*****************
FUNCTION envio()
*****************

LOCAL usuario,contrasena,ip_ftp,fichero_subida,fichero_bajada

&&asignamos los valores a las variables que se van a usar
usuario:= 'usuariol' &&usuario definido en el ftp
contrasena:= 'contrasena' &&contraseña de acceso para ese usuario en el ftp
fichero_subida:= ('borrados.txt') &&ruta y nombre del fichero que se quiere subir
fichero_bajada:= ('\\ipftp\borrados.txt') &&ruta y nombre del fichero que se quiere bajar
ip_ftp:= 'aqui va la ip del ftp'

aux=GPRSCONNECT() &&establecemos la conexión
hInternet := InternetOpen( "Anystring", INTERNET_OPEN_TYPE_DIRECT, 0, 0, 0 )
&&en hInternet nos devuelve un valor que si es cero indica que no se ha podido establecer
IF hINTERNET = 0
INTERNETCLOSEHANDLE( hInternet )
GPRSRELEASE(aux)
MSGSTOP("Error en la conexión de internet","Error")
RETURN NIL
ENDIF

&&Una vez establecida la conexión con internet realizamos la conexión con el ftp
hCon = INTERNETCONNECT( hInternet, ip_ftp,0, usuario,contrasena, INTERNET_SERVICE_FTP, 0,0 )
&&en hCon nos devuelve un valor que si es cero indica que ha ocurrido un error durante la conexión
&&con el ftp. El error puede ser debido a que el usuario y/o la contraseña son erroneas
IF HCON = 0
INTERNETCLOSEHANDLE( hCon )
INTERNETCLOSEHANDLE( hInternet )
GPRSRELEASE(aux)
MSGSTOP("Error en la conexión FTP","Error")
RETURN NIL
ENDIF

&&controlamos si lo que queremos hacer es enviar o recibir
IF tipo='enviar'
FTPPUTFILE( hCon, fichero_subida, 'borrados.txt', 0, 0 )
MsgInfo("Archivo enviado con éxito","Información")

ELSE
FTPGETFILE( hCon, fichero_bajada, (CURDIR()+'\borrados_2.txt'),0,FILE_ATTRIBUTE_ARCHIVE,0,0 )
MsgInfo("Archivo recibido con éxito","Información")

ENDIF

&&liberamos la conexión para que no siga activa
INTERNETCLOSEHANDLE( hCon )
INTERNETCLOSEHANDLE( hInternet )
GPRSRELEASE(aux)
msginfo('Aplicación finalizada')

RETURN nil



Nota: este es todo el codigo y el problema lo tengo en la funcion ftpgetfile()


Saludos y gracias....
Elías Torres.

Posted: Fri Nov 21, 2008 2:35 pm
by Biel EA6DD
Hola Elias, cuando dices que te lo descarga y luego te lo borra, como lo compruebas?. Detienes la aplicacion y desde el explorardor de archivos puedes ver el fichero descargado?

Es estraño, el codigo parece correcto. Si tu FTP es un servidor con Linux, debes tener en cuenta las mayusculas y minusculas, en el envio no lo notaras puesto que lo grabara tal cual lo envies, pero en la recepcion si no coincide exactamente, no te descargara el fichero. Es lo único que se me ocurre.

Posted: Fri Nov 21, 2008 7:35 pm
by Corina
Buenas tardes, primero presentarme, soy compañera de trabajo de Elias.

Biel, a lo que se refiere Elias es que cuando lanzó la aplicación sobre su HTC Touch el pudo ver como si efectivamente obtuviera el fichero, pero que una vez finalizó la ejecución este fichero despareció del dispositivo móvil.

En realidad nos preocupa más que la aplicación debe correr sobre otro dispositivo OptimusPDA SP5721 de Metrologic con Windows CE y al lanzar el ejecutable en este dispositivo da el siguiente error:

"Cannot find 'prueba_ftp' (or one of its components). Make sure the path and filename are correct and that all the required libraries are available."

¿Pudiera ser problema del SO del dispositivo? probando sobre el emulador de Windows Mobile, la aplicación funciona, al igual que con el móvil de Elias.

Cualquier ayuda sera bien recibida, gracias de antemano.

Posted: Fri Nov 21, 2008 7:46 pm
by Antonio Linares
Corina,

> con Windows CE

Para que funcione correctamente en Windows CE hay que hacer lo siguiente:

1. No enlazar aygshell.lib al construir el EXE.

2. Anadir este codigo al PRG principal para que se pueda construir el EXE:

Code: Select all

#pragma BEGINDUMP

void SHCreateMenuBar( void ) {}
void SHFindMenuBar( void ) {}
void SHDoneButton( void ) {}
void SHFullScreen( void ) {}
void SHSipInfo( void ) {}
void SHRecognizeGesture( void ) {}

#pragma ENDDUMP 

Posted: Sat Nov 22, 2008 1:41 am
by Antonio Linares
Comprueba que valor te devuelve la llamada a la funcion:

MsgInfo( FTPGETFILE( hCon, fichero_bajada, (CURDIR()+'\borrados_2.txt'),0,FILE_ATTRIBUTE_ARCHIVE,0,0 ) )

Posted: Mon Nov 24, 2008 10:03 am
by Corina
Buenas,

Que hay Antonio, probé con lo que me indicaste, en el buildce.bat comenté la línea donde se enlazaba con la librería aygshell.lib y si miras el código que pegó Elias, justo debajo de los primeros includes le puse el código que me dejaste.

Compilé de nuevo y se generó el exe sin problemas pero sigue saliendo el mismo error cuando se lanza la aplicación sobre el dispositivo.

No se porque me da que en la pda me falta alguna librería...

Posted: Mon Nov 24, 2008 1:35 pm
by Antonio Linares
Corina,

Descarga esta utilidad:

www.fivetechsoft.com/files/software/peinfo.exe

Y usala en tu PC para inspeccionar el EXE para el Pocket PC, y podrás comprobar que DLLs externas usa, y asi ver cual es la que no tiene Windows CE. Tienes que mirar en la opción "imports".

Posted: Mon Nov 24, 2008 5:59 pm
by Corina
Buenas Antonio,

Pues me da que la cosa va a estar algo complicada, seguí tus indicaciones e utilizé el peinfo.exe para ver que dlls se utilizan y resulta que me aparece la "cellcore.dll" que en el windows ce version 5.00 no existe.

Navegando por internet descubro que dicha dll es para Windows Mobile y que al parecer reside en la ROM de la pda. Tambien he visto que esta dll se incorpora en la versión 6 del Windows CE, así que no se que hacer ahora.

En fin,... a ver como lo solucionamos.

Gracias por la ayuda

Posted: Mon Nov 24, 2008 9:46 pm
by Antonio Linares
Corina,

Has visto con peinfo.exe que funciones de "cellcore.dll" estas usando ?

Más facíl, no enlaces cellcore.lib y asi te saldrán las funciones que usas de ella. A ver como podemos reeemplazarlas :-)

Posted: Tue Nov 25, 2008 10:18 am
by Corina
Las funciones que se utilizan son las de la conexion.

ConnMgrConnectionStatus
ConnMgrEstablishConnection
ConnMgrReleaseConnection

He estado mirando por internet y hablan de RAS (Remote Access Service) para establecer una conexion GPRS, pero no lo tengo muy claro, voy a seguir mirando a ver que encuentro para poder substituir el tema de la conexión.

Un saludo