Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Descargar archivo con Delphi (https://www.clubdelphi.com/foros/showthread.php?t=75138)

Gothem 31-07-2011 23:18:57

Descargar archivo con Delphi
 
Hola, buenas.

Estoy creando un programa con delphi y me ha surgido un problema. Necesito que, al iniciarse el programa, este descargue un archivo de internet a un directorio en mi ordenador.

¿Cómo podría conseguirlo?

Muchas gracias.

newtron 01-08-2011 08:53:15

Hola.

¿Ese sitio de internet es un sitio ftp del que tienes los datos de user, password, etc?

Neftali [Germán.Estévez] 01-08-2011 09:57:26

Has una búsqueda en los foros por la palabra URLMon. Esa búsqueda te llevará a unos cuentos hilos sobre el tema.

Es la unit que incluye funciones (entre otras) para realizar una descarga de archivos.

Gothem 01-08-2011 21:28:21

No newtron, no es ningún ftp, digamos por ejemplo que sería algo así como descargar una simple imagen buscada en google images.

Voy a probar lo de URLMon.

Gothem 01-08-2011 22:00:26

He encontrado algo aquí-> ww.clubdelphi.com/foros/showthread.php?t=67586&highlight=URLMon

El problema es que soy principiante y no se muy bien como usar eso. ¿Alguna sugerencia?

Gracias.

Neftali [Germán.Estévez] 01-08-2011 23:05:47

Aquí tienes un ejemplo de cómo descargar imágenes de la web.
TidHTTP descargar imágenes de la web

Gothem 03-08-2011 00:47:38

Neftali, gracias pero creo que eso es un poco complicado para mí, además de que se aleja de lo que yo realmente quería, que era descargar un único archivo.
En mi mensaje anterior dejaba un link de algo que me podría servir y pedía consejo sobre cómo utilizarlo.

A ver si alguien me echa un cable acerca de eso.

Gracias.

Gothem 03-08-2011 01:50:52

Vale, olvidad eso, ya lo he conseguido.

Pero ahora tengo otro problema. El antivirus (tras meter ese código y ejecutar la aplicación) la detecta como potencialmente peligrosa... ¿solución a eso?

escafandra 03-08-2011 16:07:00

Usa la API URLDownloadToFile


Código Delphi [-]
uses  Urlmon

URLDownloadToFile(nil, PCHAR(URL), PCHAR(FileName), 0, nil);


Saludos.

Neftali [Germán.Estévez] 03-08-2011 16:15:40

Cita:

Empezado por Gothem (Mensaje 408284)
Pero ahora tengo otro problema. El antivirus (tras meter ese código y ejecutar la aplicación) la detecta como potencialmente peligrosa... ¿solución a eso?

¿Qué antivirus estás utilizando?
Tendrás que decirle al antivirus que tu aplicación es segura.
¿Estás descargando algo peligroso? ¿Un EXE o similar?

Gothem 03-08-2011 23:12:41

Uso Nod32, y si, puedo decirle a él que es segura, pero me interesa que tampoco sea detectado en el resto de ordenadores del mundo :S.

El archivo que descargo es un .jpg, totalmente inofensivo.

PD: El código que he usado es el que sale en el link que he puesto yo.

Neftali [Germán.Estévez] 04-08-2011 08:50:20

No se, prueba en otros ordenadores, pero no debería dar aviso, a no ser que tengas el nivel de protección muy alto.
Si tienes posibilidad prueba el programa en otros equipos/máquinas virtuales.

escafandra 04-08-2011 09:08:25

¿El resto de la aplicación es "normal"?, es decir, ¿Es una aplicación típica con formularios o API pura?.

Yo he tenido algún problema con el AV al compilar aplicaciones API pura, me refiero a escribir el bucle de mensajes, funciones de respuesta a los WM_ y demás... En este tipo de aplicaciones, algunas API hacen saltar las alarmas. Para solucionar este escollo importo de forma dinámica las APIs conflictivas, en este caso URLDownloadToFile.

Este efecto no lo he observado en aplicaciones de consola normales ni en las aplicaciones típicas.


Saludos.

Gothem 04-08-2011 13:53:34

Si, mi aplicación es API pura, igual puede ser por eso. ¿Cómo importo dinamicamente para que no me salte el antivirus?

escafandra 04-08-2011 14:10:38

El siguiente método te servirá para importar APIs dináminamente y ejecutarlas:

Código Delphi [-]
type
  PURLDownloadToFile = function(pCaller: Pointer; szURL, szFileName: PCHAR; dwReserved: Cardinal; lpfnCB: Pointer): Cardinal; stdcall;

var
  URLDownloadToFile: PURLDownloadToFile;
  hLib: Integer;

begin
  hLib:= LoadLibrary('urlmon.dll');
  URLDownloadToFile:= GetProcAddress(hLib, 'URLDownloadToFileA');
  URLDownloadToFile(nil, PCHAR('http://telmosilva.files.wordpress.com/2010/03/informatica_12.jpg'), PCHAR('FileName.jpg'), 0, nil);
  FreeLibrary(hLib);
end.

Saludos.

Gothem 04-08-2011 18:18:47

Vale, atentos, el problema no está en descargar el archivo, sino en ejecutarlo. El archivo se descarga normalmente (este paso no es detectado por el antivirus), pero a la hora de ejecutarlo mediante esto:
Código Delphi [-]
ShellExecute(Application.Handle, PChar('open'), PChar(DestFile), PChar(''), nil, SW_NORMAL);

Ese es concretamente el paso detectado, de modo que debo encontrar una manera de que no lo detecte como maligno, porque dudo mucho que ejecutar un .jpg tenga mucha maldad hahah.

escafandra 04-08-2011 22:37:45

Cita:

Empezado por Gothem (Mensaje 408523)
Vale, atentos, el problema no está en descargar el archivo, sino en ejecutarlo. El archivo se descarga normalmente (este paso no es detectado por el antivirus), pero a la hora de ejecutarlo mediante esto:
Código Delphi [-]
ShellExecute(Application.Handle, PChar('open'), PChar(DestFile), PChar(''), nil, SW_NORMAL);

Ese es concretamente el paso detectado, de modo que debo encontrar una manera de que no lo detecte como maligno, porque dudo mucho que ejecutar un .jpg tenga mucha maldad hahah.

Dos cosas:

1.- No estés seguro que un jpg no venga con "truco". ¿Oíste hablar del desbordamiento del buffer?. Analiza ese archivo.

2.- La API ShellExecute puede hacer saltar la alarma, impórtala de forma dinámica y a ver que pasa.

Saludos.

Gothem 04-08-2011 23:00:03

1- El jpg es una imagen libre de virus subida por mi mismo.
2- Probaría eso pero... ¿qué debo poner exactamente?

Gracias por tu respuesta. Estoy aprendiendo más en una semana que en toda mi corta vida.

escafandra 04-08-2011 23:59:19

Código Delphi [-]
type
  PShellExecute = function(hwnd: Cardinal; lpOperation, lpFile, lpParameters, lpDirectory: PCHAR; nShowCmd: integer): Cardinal; stdcall;

var
  ShellExecute: PShellExecute;
  hLib: Integer;

begin
  hLib:= LoadLibrary('Shell32.dll');
  ShellExecute:= GetProcAddress(hLib, 'ShellExecuteA');
  ShellExecute(0, PCHAR('open'), PCHAR('File.jpg'), nil, nil, SW_NORMAL);
  FreeLibrary(hLib);
end.

Saludos.

escafandra 05-08-2011 00:16:26

Un detalle que me llama la atención, usas Application.Handle Si tu Aplicación es API pura no usa la VCL y por lo tanto no la variable global Application :eek:

¿El AV salta con cualquier proyecto?. Obsérvalo.

Saludos.


La franja horaria es GMT +2. Ahora son las 20:06:10.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi