FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Descargar Archivos de Internet con C++
Hola a todos los del Foros,
Quisiera que me ayudaran con una duda que tengo en una aplicación que estoy haciendo para descargar archivos de Internet, La idea que tengo para mi aplicación es que me descargue un archivo de Internet Diario (es la actualización de mi antivirus -Kaspersky-) E logrado descargar el archivo de Internet con este código. Code: //Poniendo el Contenido del Edit1 en una Variable Char int tam=Edit1->Text.Length(); char* Url_Down=new char[tam+1]; strcpy (Url_Down,Edit1->Text.c_str()); //Poniendo el Contenido del Edit2 en otra Variable Char int tam2=Edit2->Text.Length(); char* Dir_Guard=new char[tam2+1]; strcpy (Dir_Guard,Edit2->Text.c_str()); //Descargando la URL puesto en el Edit1 y guardando lo en el Directorio del Edit2 HRESULT hr = URLDownloadToFile(0,Url_Down,Dir_Guard, 0, 0); //Mostrando mensages de descarga if (hr == S_OK) ShowMessage("Se a Terminado la Descargado Correctamente"); else ShowMessage("A Ocurrido un Error en la Descarga"); -En el Edit1 se pone la direccion del Archivo o Pagina a descargar. -En el Edit2 se pone la ruta y el nombre con el que quiero descargar mi archivo o Pagina. -Pero tengo algunas dudas sobre ese código como el puede ten conexión a Internet si no tiene identificado ningún proxy, -A otra cosa cuando me empieza a descargar me pone la maquina lentísima y no puedo hacer nada en la aplicación por que se bloquea pero sigue descargando cuando termina de descargara es que se desbloquea el programa y se quita la lentitud de la PC. Me gustaria que me ayudara a optimizar mi aplicacion, quisiera poder incluirle un Proxy + Pueto_Usuario + Contraseña para que la apalicacion tenga su propia conexión a Internet por que creo que este codigo se conecta a Internet mediante la configuarion de mi navegador (Supongo yo). Gracias a todos de antemano... [Saludos]... |
#2
|
||||
|
||||
Hola de nuevo, yelian.
Si tu programa parece "colgado" durante la descarga, quizás deberías pensar en colocar tu código de descarga en un hilo a parte. Otra posibilidad sería establecer un IBindStatusCallback y colocar Application->ProcessMessages(); en el evento OnProgress. Para el problema del proxy, debes realizar una autentificación previa a la descarga. Te dejo un ejemplo: Código:
//--------------------------------------------------------------------------- bool Authenticate(HWND hWnd, char *URL) { HINTERNET hOpenHandle, hConnectHandle, hResourceHandle; DWORD dwError, dwErrorCode; char c; URL_COMPONENTS URL_C = {sizeof(URL_COMPONENTS)}; URL_C.lpszScheme = &c; URL_C.dwSchemeLength = 1; URL_C.lpszHostName = &c; // URL_C.dwHostNameLength = 0; URL_C.lpszUserName = &c; // URL_C.dwUserNameLength = 0; URL_C.lpszPassword = &c; // URL_C.dwPasswordLength = 0; URL_C.lpszUrlPath = &c; // URL_C.dwUrlPathLength = 0; URL_C.lpszExtraInfo = &c; // URL_C.dwExtraInfoLength = 0; InternetCrackUrl(URL, strlen(URL), ICU_DECODE, &URL_C); URL_C.lpszScheme = new char[URL_C.dwSchemeLength]; URL_C.lpszHostName = new char[URL_C.dwHostNameLength]; URL_C.lpszUserName = new char[URL_C.dwUserNameLength]; URL_C.lpszPassword = new char[URL_C.dwPasswordLength]; URL_C.lpszUrlPath = new char[URL_C.dwUrlPathLength]; URL_C.lpszExtraInfo = new char[URL_C.dwExtraInfoLength]; InternetCrackUrl(URL, strlen(URL), ICU_DECODE, &URL_C); hOpenHandle = InternetOpen("Agent", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); hConnectHandle = InternetConnect(hOpenHandle, URL_C.lpszHostName, INTERNET_INVALID_PORT_NUMBER, NULL, NULL, INTERNET_SERVICE_HTTP, 0,0); hResourceHandle = HttpOpenRequest(hConnectHandle, "GET", URL_C.lpszUrlPath, NULL, NULL, NULL, INTERNET_FLAG_KEEP_CONNECTION, 0); delete URL_C.lpszScheme; delete URL_C.lpszHostName; delete URL_C.lpszUserName; delete URL_C.lpszPassword; delete URL_C.lpszUrlPath; delete URL_C.lpszExtraInfo; for(int n=0; n<2; n++){ HttpSendRequest(hResourceHandle, NULL, 0, NULL, 0); dwErrorCode = hResourceHandle ? ERROR_SUCCESS : GetLastError(); dwError = InternetErrorDlg(hWnd, hResourceHandle, dwErrorCode, FLAGS_ERROR_UI_FILTER_FOR_ERRORS | FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS | FLAGS_ERROR_UI_FLAGS_GENERATE_DATA, NULL); if (dwError != ERROR_INTERNET_FORCE_RETRY) break; } return (dwError != ERROR_INTERNET_FORCE_RETRY);} Código:
void __fastcall TForm1::Button1Click(TObject *Sender) { char File[] = "http://www.terawiki.clubdelphi.com/CPPBuilderWin32/Ejemplos/?download=Otro+Usuario.rar"; HRESULT R; Authenticate(Handle, File); R = URLDownloadToFile(0, File, "C:\\File.rar", 0, 0); } PD He optimizado un poco el código. Última edición por escafandra fecha: 15-04-2009 a las 18:50:59. Razón: Optimización de código |
#3
|
|||
|
|||
escafandra muchas Gracias por el codigo anterior, pero tengo un problema con el codigo, cuando lo voy a utilizar me saltan una serie de errores que no me dejan compilar el codigo y no estoy seguro de por que es.
ERRORES: --------- -Unresolved external 'InternetCrackUrlA' referenced from (Ruta de la Aplicacion) -Unresolved external 'InternetOpenA' referenced from (Ruta de la Aplicacion) -Unresolved external 'InternetConnectA' referenced from (Ruta de la Aplicacion) -...... -...... Entre otros mas, Creo que es porque tengo que declarar esas funciones que esta utilizando el codigo en la parte PRIVATE no . Si alguien me pudiera aclar la duda se lo agradeseria... [Saludos]... |
#4
|
||||
|
||||
Debes incluir la librería Wininet.lib y Urlmon.lib bien en tu proyecto o bien mediante pragma.
Código:
#pragma link "$(BCB)\\lib\\PSDK\\Urlmon.lib" #pragma link "$(BCB)\\lib\\PSDK\\Wininet.lib" |
#5
|
||||
|
||||
Duda
Hola
Este codigo fue posteado por escafandra respondiendole a Yelian en este hilo al probarlo me surgen las siguientes dudas 1- Donde pongo la primera parte del codigo ??? 2- Al correr el programa me devuelve los siguientes errores [C++ Error] Unit1.cpp(89): E2268 Call to undefined function 'URLDownloadToFile' [C++ Warning] Unit1.cpp(90): W8004 'R' is assigned a value that is never used A continuacion les pongo el codigo Primera parte esta es la que no me queda clara dodne ponerlo, por lo tanto lo puse debajo de los #include Código:
//--------------------------------------------------------------------------- bool Authenticate(HWND hWnd, char *URL) { HINTERNET hOpenHandle, hConnectHandle, hResourceHandle; DWORD dwError, dwErrorCode; char c; URL_COMPONENTS URL_C = {sizeof(URL_COMPONENTS)}; URL_C.lpszScheme = &c; URL_C.dwSchemeLength = 1; URL_C.lpszHostName = &c; // URL_C.dwHostNameLength = 0; URL_C.lpszUserName = &c; // URL_C.dwUserNameLength = 0; URL_C.lpszPassword = &c; // URL_C.dwPasswordLength = 0; URL_C.lpszUrlPath = &c; // URL_C.dwUrlPathLength = 0; URL_C.lpszExtraInfo = &c; // URL_C.dwExtraInfoLength = 0; InternetCrackUrl(URL, strlen(URL), ICU_DECODE, &URL_C); URL_C.lpszScheme = new char[URL_C.dwSchemeLength]; URL_C.lpszHostName = new char[URL_C.dwHostNameLength]; URL_C.lpszUserName = new char[URL_C.dwUserNameLength]; URL_C.lpszPassword = new char[URL_C.dwPasswordLength]; URL_C.lpszUrlPath = new char[URL_C.dwUrlPathLength]; URL_C.lpszExtraInfo = new char[URL_C.dwExtraInfoLength]; InternetCrackUrl(URL, strlen(URL), ICU_DECODE, &URL_C); hOpenHandle = InternetOpen("Agent", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); hConnectHandle = InternetConnect(hOpenHandle, URL_C.lpszHostName, INTERNET_INVALID_PORT_NUMBER, NULL, NULL, INTERNET_SERVICE_HTTP, 0,0); hResourceHandle = HttpOpenRequest(hConnectHandle, "GET", URL_C.lpszUrlPath, NULL, NULL, NULL, INTERNET_FLAG_KEEP_CONNECTION, 0); delete URL_C.lpszScheme; delete URL_C.lpszHostName; delete URL_C.lpszUserName; delete URL_C.lpszPassword; delete URL_C.lpszUrlPath; delete URL_C.lpszExtraInfo; for(int n=0; n<2; n++){ HttpSendRequest(hResourceHandle, NULL, 0, NULL, 0); dwErrorCode = hResourceHandle ? ERROR_SUCCESS : GetLastError(); dwError = InternetErrorDlg(hWnd, hResourceHandle, dwErrorCode, FLAGS_ERROR_UI_FILTER_FOR_ERRORS | FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS | FLAGS_ERROR_UI_FLAGS_GENERATE_DATA, NULL); if (dwError != ERROR_INTERNET_FORCE_RETRY) break; } return (dwError != ERROR_INTERNET_FORCE_RETRY);} Código:
void __fastcall TForm1::Button1Click(TObject *Sender) { char File[] = "http://www.terawiki.clubdelphi.com/CPPBuilderWin32/Ejemplos/?download=Otro+Usuario.rar"; HRESULT R; Authenticate(Handle, File); R = URLDownloadToFile(0, File, "C:\\File.rar", 0, 0); } Código:
#pragma link "$(BCB)\\lib\\PSDK\\Urlmon.lib" #pragma link "$(BCB)\\lib\\PSDK\\Wininet.lib"
__________________
Nunca esta de más volver a ver la "Guia de Estilo" o "La Otra Guia de Estilo". Recuerda siempre usar los "Tags" para una mejor legibilidad de tu código. Cuando miras fijamente al abismo, este te devuelve la mirada oo______ooo_____ooo_ooooooo_____ooo____oooooo____ooooooo______oooo____ooo____oo_ oo______oooo___oooo_oo____oo__oo___oo__oo____oo__oo____oo___oo____oo__oooo___oo_ oo______oo_oo_oo_oo_oo____oo_oo_____oo_oo_____oo_oo____oo__oo______oo_oo_oo__oo_ oo______oo__ooo__oo_oooooo___ooooooooo_oo_____oo_ooooooo___oo______oo_oo__oo_oo_ oo______oo_______oo_oo_______oo_____oo_oo____oo__oo____oo___oo____oo__oo___oooo_ ooooooo_oo_______oo_oo_______oo_____oo_oooooo____oo_____oo____oooo____oo____ooo_ ________________________________________________________________________________ |
#6
|
||||
|
||||
Lo correcto es que expreses tus dudas en el hilo al que haces referencia. Además, "Duda" no es un título adecuado para un hilo.
// Saludos |
#7
|
||||
|
||||
es cierto, mis dusculpas, ahora como lo arreglo ????????? como puedo ponerlo de vuelta a donde pertenece y como elimino este hilo de aki
__________________
Nunca esta de más volver a ver la "Guia de Estilo" o "La Otra Guia de Estilo". Recuerda siempre usar los "Tags" para una mejor legibilidad de tu código. Cuando miras fijamente al abismo, este te devuelve la mirada oo______ooo_____ooo_ooooooo_____ooo____oooooo____ooooooo______oooo____ooo____oo_ oo______oooo___oooo_oo____oo__oo___oo__oo____oo__oo____oo___oo____oo__oooo___oo_ oo______oo_oo_oo_oo_oo____oo_oo_____oo_oo_____oo_oo____oo__oo______oo_oo_oo__oo_ oo______oo__ooo__oo_oooooo___ooooooooo_oo_____oo_ooooooo___oo______oo_oo__oo_oo_ oo______oo_______oo_oo_______oo_____oo_oo____oo__oo____oo___oo____oo__oo___oooo_ ooooooo_oo_______oo_oo_______oo_____oo_oooooo____oo_____oo____oooo____oo____ooo_ ________________________________________________________________________________ |
#8
|
||||
|
||||
Ya está
|
#9
|
||||
|
||||
No había visto que el hilo se revivía hasta ahora mismo.
Voy a tratar de aclarar las dudas surgidas: 1.- Para que la llamada a las APIs usadas funcionen se deben incluir las librerías Urlmon.lib y Wininet.lib en el proyecto. estas se encuentran en la carpeta donde está instalado el Builder C++ lib\PSDK\. o, si se prefiere, se pueden añadir las líneas de código expuestas al principio, dende los includes: Código:
#pragma link "$(BCB)\\lib\\PSDK\\Urlmon.lib" #pragma link "$(BCB)\\lib\\PSDK\\Wininet.lib" 3.- El código del botón está puesto así como ejemplo. realmente lo importante es hacer la llamada a Authenticate para autentificarse ante un proxy si existe, para luego llamar a la API URLDownloadToFile que es la que realiza la descarga. Saludos. |
#10
|
||||
|
||||
Si, eso lo he entendido, pero aun me sigue dando el error, inclui las librerias de esa forma exactamente, puse el Authenticate en un .h y despues lo inclui. Pero aun asi me sigue diciendo lo siguiente
[C++ Error] Unit1.cpp(27): E2268 Call to undefined function 'URLDownloadToFile' [C++ Warning] Unit1.cpp(30): W8004 'R' is assigned a value that is never used si comento la linea Código:
R = URLDownloadToFile(0, File, "C:\\File.rar", 0, 0); tambien los copie hacia la carpeta donde tengo el proyecto y nada, que hago !!!!!!
__________________
Nunca esta de más volver a ver la "Guia de Estilo" o "La Otra Guia de Estilo". Recuerda siempre usar los "Tags" para una mejor legibilidad de tu código. Cuando miras fijamente al abismo, este te devuelve la mirada oo______ooo_____ooo_ooooooo_____ooo____oooooo____ooooooo______oooo____ooo____oo_ oo______oooo___oooo_oo____oo__oo___oo__oo____oo__oo____oo___oo____oo__oooo___oo_ oo______oo_oo_oo_oo_oo____oo_oo_____oo_oo_____oo_oo____oo__oo______oo_oo_oo__oo_ oo______oo__ooo__oo_oooooo___ooooooooo_oo_____oo_ooooooo___oo______oo_oo__oo_oo_ oo______oo_______oo_oo_______oo_____oo_oo____oo__oo____oo___oo____oo__oo___oooo_ ooooooo_oo_______oo_oo_______oo_____oo_oooooo____oo_____oo____oooo____oo____ooo_ ________________________________________________________________________________ |
#11
|
||||
|
||||
Tambien comente las lineas de los include a ver que pasaba y me devolvio el mismo error asi que el problema es que no se me estan incluyendo, conoces otra forma de incluirlas ???
Código:
//#pragma link "$(BCB)\\lib\\PSDK\\Urlmon.lib" //#pragma link "$(BCB)\\lib\\PSDK\\Wininet.lib"
__________________
Nunca esta de más volver a ver la "Guia de Estilo" o "La Otra Guia de Estilo". Recuerda siempre usar los "Tags" para una mejor legibilidad de tu código. Cuando miras fijamente al abismo, este te devuelve la mirada oo______ooo_____ooo_ooooooo_____ooo____oooooo____ooooooo______oooo____ooo____oo_ oo______oooo___oooo_oo____oo__oo___oo__oo____oo__oo____oo___oo____oo__oooo___oo_ oo______oo_oo_oo_oo_oo____oo_oo_____oo_oo_____oo_oo____oo__oo______oo_oo_oo__oo_ oo______oo__ooo__oo_oooooo___ooooooooo_oo_____oo_ooooooo___oo______oo_oo__oo_oo_ oo______oo_______oo_oo_______oo_____oo_oo____oo__oo____oo___oo____oo__oo___oooo_ ooooooo_oo_______oo_oo_______oo_____oo_oooooo____oo_____oo____oooo____oo____ooo_ ________________________________________________________________________________ |
#12
|
||||
|
||||
La definición de la API URLDownloadToFile se encuentra en Urlmon.h
Código:
#include "Urlmon.h" Saludos. |
#13
|
||||
|
||||
Gracias por la solucion, funciona perfectamente, ahora solo me deja un WARNING diciendome que R es un valor que nunca se usa, pero de todas formas descarga bien.
Ahora una pequeña consulta mas, si no es molestia 1. Trate de usar un Edit para que se poueda poner la url sinembargo no puedo agregarselo, porque no reconoce al edit, lo que quciera saber si se puede hacer es algo como esto Código:
char File[] = Edit1->Text; Código:
R = URLDownloadToFile(0, File, "C:\\" + Edit2->Text, 0, 0);
__________________
Nunca esta de más volver a ver la "Guia de Estilo" o "La Otra Guia de Estilo". Recuerda siempre usar los "Tags" para una mejor legibilidad de tu código. Cuando miras fijamente al abismo, este te devuelve la mirada oo______ooo_____ooo_ooooooo_____ooo____oooooo____ooooooo______oooo____ooo____oo_ oo______oooo___oooo_oo____oo__oo___oo__oo____oo__oo____oo___oo____oo__oooo___oo_ oo______oo_oo_oo_oo_oo____oo_oo_____oo_oo_____oo_oo____oo__oo______oo_oo_oo__oo_ oo______oo__ooo__oo_oooooo___ooooooooo_oo_____oo_ooooooo___oo______oo_oo__oo_oo_ oo______oo_______oo_oo_______oo_____oo_oo____oo__oo____oo___oo____oo__oo___oooo_ ooooooo_oo_______oo_oo_______oo_____oo_oooooo____oo_____oo____oooo____oo____ooo_ ________________________________________________________________________________ |
#14
|
||||
|
||||
Cita:
Código:
char File[] = Edit1->Text.c_str(); Cita:
Saludos. |
#15
|
||||
|
||||
Código:
char File[] = Edit1->Text.c_str(); Código:
[C++ Error] Unit1.cpp(26): E2034 Cannot convert 'char *' to 'char[]'
__________________
Nunca esta de más volver a ver la "Guia de Estilo" o "La Otra Guia de Estilo". Recuerda siempre usar los "Tags" para una mejor legibilidad de tu código. Cuando miras fijamente al abismo, este te devuelve la mirada oo______ooo_____ooo_ooooooo_____ooo____oooooo____ooooooo______oooo____ooo____oo_ oo______oooo___oooo_oo____oo__oo___oo__oo____oo__oo____oo___oo____oo__oooo___oo_ oo______oo_oo_oo_oo_oo____oo_oo_____oo_oo_____oo_oo____oo__oo______oo_oo_oo__oo_ oo______oo__ooo__oo_oooooo___ooooooooo_oo_____oo_ooooooo___oo______oo_oo__oo_oo_ oo______oo_______oo_oo_______oo_____oo_oo____oo__oo____oo___oo____oo__oo___oooo_ ooooooo_oo_______oo_oo_______oo_____oo_oooooo____oo_____oo____oooo____oo____ooo_ ________________________________________________________________________________ |
#16
|
||||
|
||||
Código:
char* File = Edit1->Text.c_str(); |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Descargar un archivo de Internet | c0lo | Internet | 10 | 14-05-2016 04:44:25 |
como descargar ficheros de internet | jfadelphi | Varios | 3 | 04-03-2009 09:14:59 |
Descargar Archivos | Deiv | HTML, Javascript y otros | 6 | 25-12-2007 08:52:55 |
Descargar fichero 25 Mb desde internet | fmatias | Internet | 4 | 06-07-2007 17:43:59 |
Descargar imágenes de internet via http. | alfredosg19 | Internet | 2 | 08-04-2005 13:02:27 |
|