 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Dom 22 Abr, 2018 2:12 pm Asunto: IBindStatusCallback::OnProgress Method |
|
|
Estoy descargando un fichero con la ayuda de Leo...
Pero ahora necesito tener un ProgresBar sobre el control de la descarga.
Estoy utilizando la función del API URLDownloadToFile() el cual si encuentra el fichero en la url comienza la descarga, pero no avanza el codigo hasta que termine la descarga y necesito ver en una BARRA DE PROGRESO el estado de la descarga.
El último parametro de URLDownloadToFile() puede ser un (IBindStatusCallback::OnProgress Method)
He intentado implementarlo, pero no consigo que funcione.
| Código: |
#include <urlmon>
#pragma comment (lib, "urlmon.lib")
String url = "https://www.tpvbarman.com/nzw/version_update.dat";
String file = "d:\\version_update.dat";
URLDownloadToFile(NULL, url.w_str(), file.w_str(), 0, NULL);
|
Necesito el estado de la descarga mas o menos así:
| Código: |
#include <urlmon>
#pragma comment (lib, "urlmon.lib")
String url = "https://www.tpvbarman.com/nzw/version_update.dat";
String file = "d:\\version_update.dat";
URLDownloadToFile(NULL, url.w_str(), file.w_str(), 0, IBindStatusCallback::OnProgress Method);
|
_________________ Muchos hombres no se equivocan jamás porque no se proponen nada razonable. |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Dom 22 Abr, 2018 11:08 pm Asunto: |
|
|
| Código: | #define NOT_IMPLEMENTED { return E_NOTIMPL; }
struct TCallback : IBindStatusCallback
{
TProgressBar* ProgressBar;
//---IBindStatusCallback
STDMETHOD(OnStartBinding)(DWORD dwReserved, IBinding *pib) NOT_IMPLEMENTED
STDMETHOD(GetPriority)(LONG *pnPriority) NOT_IMPLEMENTED
STDMETHOD(OnLowResource)(DWORD reserved) NOT_IMPLEMENTED
STDMETHOD(OnProgress)(ULONG ulProgress, ULONG ulProgressMax,
ULONG ulStatusCode, LPCWSTR wszStatusText)
{
ProgressBar->Max = ulProgressMax;
ProgressBar->Position = ulProgress;
//Opcional: Application->ProcessMessages();
return S_OK;
}
STDMETHOD(OnStopBinding)(HRESULT hresult, LPCWSTR szError) NOT_IMPLEMENTED
STDMETHOD(GetBindInfo)(DWORD *grfBINDF, BINDINFO *pbindinfo) NOT_IMPLEMENTED
STDMETHOD(OnDataAvailable)(DWORD grfBSCF, DWORD dwSize,
FORMATETC *pformatetc, STGMEDIUM *pstgmed) NOT_IMPLEMENTED
STDMETHOD(OnObjectAvailable)(REFIID riid, IUnknown *punk) NOT_IMPLEMENTED
//---IUnknown
STDMETHOD_(ULONG,AddRef)() { return 0; }
STDMETHOD_(ULONG,Release)() { return 0; }
STDMETHOD(QueryInterface)(REFIID riid, void **ppvObject) NOT_IMPLEMENTED
}; |
| Código: | TCallback Callback;
Callback.ProgressBar = ProgressBar1;
String url = "https://www.tpvbarman.com/nzw/version_update.dat";
String file = "d:\\version_update.dat";
// Borrar cache opcionalmente
// Añadir: #pragma comment (lib, "wininet.lib")
DeleteUrlCacheEntry(url.w_str());
URLDownloadToFile(NULL, url.w_str(), file.w_str(), 0, &Callback); |
|
|
| Volver arriba |
|
 |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Lun 23 Abr, 2018 1:37 pm Asunto: |
|
|
Leo gracias por responder y perdona mi ignorancia, pero no consigo que el PROGRESS BAR FUNCIONE:
En cuanto el codigo toca el URLDownloadToFile parece que le pasa el progreso de la descarga a OnProgress pero no sé controlar dicho evento.
Estoy utilizando un componente LMD:
TLMDProgress* LMDProgress;
Porque utilizo ProgreesBar con componentes LMD.
| Código: |
//.h
public: // User declarations
__fastcall TfrmComprobacion(TComponent* Owner);
#define NOT_IMPLEMENTED { return E_NOTIMPL; }
struct TCallback : IBindStatusCallback
{//Esctructura para poder mostrar el ProgressBar de la descarga
TLMDProgress* LMDProgress;
//---IBindStatusCallback
STDMETHOD(OnStartBinding)(DWORD dwReserved, IBinding *pib) NOT_IMPLEMENTED
STDMETHOD(GetPriority)(LONG *pnPriority) NOT_IMPLEMENTED
STDMETHOD(OnLowResource)(DWORD reserved) NOT_IMPLEMENTED
STDMETHOD(OnProgress)(ULONG ulProgress, ULONG ulProgressMax,
ULONG ulStatusCode, LPCWSTR wszStatusText)
{
LMDProgress->MaxValue = ulProgressMax;
LMDProgress->UserValue = ulProgress;
Application->ProcessMessages();
return S_OK;
}
STDMETHOD(OnStopBinding)(HRESULT hresult, LPCWSTR szError) NOT_IMPLEMENTED
STDMETHOD(GetBindInfo)(DWORD *grfBINDF, BINDINFO *pbindinfo) NOT_IMPLEMENTED
STDMETHOD(OnDataAvailable)(DWORD grfBSCF, DWORD dwSize,
FORMATETC *pformatetc, STGMEDIUM *pstgmed) NOT_IMPLEMENTED
STDMETHOD(OnObjectAvailable)(REFIID riid, IUnknown *punk) NOT_IMPLEMENTED
//---IUnknown
STDMETHOD_(ULONG,AddRef)() { return 0; }
STDMETHOD_(ULONG,Release)() { return 0; }
STDMETHOD(QueryInterface)(REFIID riid, void **ppvObject) NOT_IMPLEMENTED
};
};
|
| Código: |
TCallback Callback;
Callback.LMDProgress = PBConexionInternet;
PBConexionInternet->UserValue = 0;
PBConexionInternet->MaxValue = 54932;
Application->ProcessMessages();
URLDownloadToFile(NULL, fV->SV->VersionUpdateFichero.w_str(), FicheroActualizacion.w_str(), 0, &Callback);
Callback.OnProgress(PBConexionInternet->UserValue, PBConexionInternet->MaxValue, 0, fV->SV->VersionUpdateFichero.w_str());
while(PBConexionInternet->UserValue <PBConexionInternet>MaxValue)
{
PBConexionInternet->UserValue = Callback.LMDProgress->UserValue;
Application->ProcessMessages();
}
|
_________________ Muchos hombres no se equivocan jamás porque no se proponen nada razonable. |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Lun 23 Abr, 2018 2:41 pm Asunto: |
|
|
A diferencia del TProgressBar que se le puede especificar un valor máximo y en Position darle los valores y el calcula el porcentaje, al TLMDProgress hay que darle el porcentaje ya calculado:
| Código: | #define NOT_IMPLEMENTED { return E_NOTIMPL; }
struct TCallback : IBindStatusCallback
{
TLMDProgress* ProgressBar;
//---IBindStatusCallback
STDMETHOD(OnStartBinding)(DWORD dwReserved, IBinding *pib) NOT_IMPLEMENTED
STDMETHOD(GetPriority)(LONG *pnPriority) NOT_IMPLEMENTED
STDMETHOD(OnLowResource)(DWORD reserved) NOT_IMPLEMENTED
STDMETHOD(OnProgress)(ULONG ulProgress, ULONG ulProgressMax,
ULONG ulStatusCode, LPCWSTR wszStatusText)
{
if (ulStatusCode == BINDSTATUS_DOWNLOADINGDATA ||
ulStatusCode == BINDSTATUS_ENDDOWNLOADDATA)
{
ProgressBar->Position = MulDiv(ulProgress, 100, ulProgressMax);
Application->ProcessMessages();
}
return S_OK;
}
STDMETHOD(OnStopBinding)(HRESULT hresult, LPCWSTR szError) NOT_IMPLEMENTED
STDMETHOD(GetBindInfo)(DWORD *grfBINDF, BINDINFO *pbindinfo) NOT_IMPLEMENTED
STDMETHOD(OnDataAvailable)(DWORD grfBSCF, DWORD dwSize,
FORMATETC *pformatetc, STGMEDIUM *pstgmed) NOT_IMPLEMENTED
STDMETHOD(OnObjectAvailable)(REFIID riid, IUnknown *punk) NOT_IMPLEMENTED
//---IUnknown
STDMETHOD_(ULONG,AddRef)() { return 0; }
STDMETHOD_(ULONG,Release)() { return 0; }
STDMETHOD(QueryInterface)(REFIID riid, void **ppvObject) NOT_IMPLEMENTED
}; |
| Código: | TCallback Callback;
Callback.ProgressBar = LMDProgress1;
String url = "https://www.tpvbarman.com/nzw/version_update.dat";
String file = "d:\\version_update.dat";
URLDownloadToFile(NULL, url.w_str(), file.w_str(), 0, &Callback); |
|
|
| Volver arriba |
|
 |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Lun 23 Abr, 2018 4:50 pm Asunto: |
|
|
Funciona perfecto, muchísimas gracias Leo...
IMPRESIONANTE!!! nada se te resiste...
Increíble la bondad y conocimiento que aportas al foro.
Estoy alucinado...  _________________ Muchos hombres no se equivocan jamás porque no se proponen nada razonable. |
|
| Volver arriba |
|
 |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Dom 06 May, 2018 2:13 pm Asunto: |
|
|
Estoy utilizando DeleteUrlCacheEntry antes de URLDownloadToFile para borrar la CACHE de algunas descargas en las que no necesito barra de progreso ni informar al usuario y descargarme el fichero actualizado en lugar de lo que tenga el caché.
El problema es que la función DeleteUrlCacheEntry borra todo el CACHE del EXPLORADOR y NO SOLO el cache de la url que le pongo y eso puede incomodar a algunos de mis clientes ya que borro todas las opciones guardadas por el usuario en los navegadores.
¿Como hago para borrar solo la caché de la url que me interesa?
| Código: |
url = "https://www.tpvbarman.com/nzw/nzw.dll"
DeleteUrlCacheEntry(url.w_str());//Borro el cache de la URL, para que descargue siempre la versión actualizada en lugar de la del CACHE
URLDownloadToFile(NULL, url.w_str(), UpdateLocal.w_str(), 0, NULL);
|
_________________ Muchos hombres no se equivocan jamás porque no se proponen nada razonable. |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Dom 06 May, 2018 7:28 pm Asunto: |
|
|
DeleteUrlCacheEntry no borra todo el cache, no al menos según la documentación de Microsoft, solo del archivo especificado y devuelve TRUE si realmente estaba en la cache y se borró algo.
Pero bueno, aunque la documentación de Microsoft diga que solo borra el archivo que se le especifique he hecho algunas pruebas y realmente es así.
Habría que ver en qué caso te está borrando lo que no es, porque además es que según la documentación y mis pruebas solo borra archivos que estén en la cache, pero esta función ni toca historial, ni cookies, ni contraseñas.. |
|
| Volver arriba |
|
 |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Lun 07 May, 2018 1:07 pm Asunto: |
|
|
Puedes intentar esto a ver si te pasa lo mismo.
Con Navegador Chrome tengo guardada usuario y contraseña de este FORO y siempre que entro no me pide loguearme de nuevo, pero si ejecuto la función:
| Código: |
url = "https://www.tpvbarman.com/nzw/nzw.dll"
DeleteUrlCacheEntry(url.w_str());
|
Cuando vuelvo a entrar al foro me pide otra vez loguearme...
Como resultado me da la impresión que no solo borra la cache del enlace, sino de algo más. _________________ Muchos hombres no se equivocan jamás porque no se proponen nada razonable. |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Lun 07 May, 2018 1:22 pm Asunto: |
|
|
No, no me produce ningún problema en Chrome, además sería raro ya que esta función no borra la cache de Chrome, solo la del Internet Explorer y no sé si Edge también la compartirá o no, pero no la del resto de navegadores que usan cada uno sus propios sistemas para esta tarea.
Pero incluso en el Internet Explorer solo borra exclusivamente el archivo que se le especifica de su cache, no toca ni cookies, ni historial ni claves.
¿Lo has probado en alguna otra máquina? ¿O por lo menos en el VirtualBox que es muy útil para probar distintos casos sin tener que estar usando otros equipos? |
|
| Volver arriba |
|
 |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Lun 07 May, 2018 1:45 pm Asunto: |
|
|
Gracias Leo, lo examinaré mejor, en cualquier caso es un mal menor. _________________ Muchos hombres no se equivocan jamás porque no se proponen nada razonable. |
|
| Volver arriba |
|
 |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Lun 07 May, 2018 1:52 pm Asunto: |
|
|
Pues ahora he realizado varias pruebas y ya no me borra los datos guardados de Usuario y Password.
Es decir toco correcto. _________________ Muchos hombres no se equivocan jamás porque no se proponen nada razonable. |
|
| Volver arriba |
|
 |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Lun 07 May, 2018 1:55 pm Asunto: |
|
|
Por cierto, se que tienes varias versiones del Builder instaladas, pero cual es la que utilizas más reciente y si me recomendarías cambiar desde la versión 2010. _________________ Muchos hombres no se equivocan jamás porque no se proponen nada razonable. |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Lun 07 May, 2018 2:10 pm Asunto: |
|
|
| JesúsGandia escribió: | | Por cierto, se que tienes varias versiones del Builder instaladas, pero cual es la que utilizas más reciente y si me recomendarías cambiar desde la versión 2010. |
Ahora mismo la que más te vale la pena es la última, Tokyo 10.2.3, aparte de todas las mejoras viene de fabrica en la Pro con los compiladores para iOS y Android, antes los vendían como un add-on aparte.
No recuerdo las diferencias con la 2010 porque hace mucho que la desinstale, no sé si este ya tenía el compilador de 64bits para Windows, pero ten en cuenta que por encima de la 2010 hay 11 versiones, así que seguramente te vas a encontrar con muchos cambios. Sobre todo, las últimas versiones tienen un montón de cosas interesantes.
Además, otra ventaja al comprar las ultimas versiones es que luego si no te gusta puedes instalar cualquiera de las anteriores. |
|
| Volver arriba |
|
 |
Alpinador Lt Cmdr

Registrado: 21 Abr 2014Mensajes: 123
|
Publicado: Sab 02 Jun, 2018 10:50 am Asunto: |
|
|
Yo tengo la 10.2.2 leo
sabes si hay algun update patch para subir a 10.2.3 ?
o tendria que instalar todo de nuevo?
si que tienes cosas interesantes si..... yo he visto que ya hay componentes para hacer cosas en 3D con camara, texturas etc
volviendo sobre el tema del hilo actual.....tengo este codigo pero no me guarda el fichero completo....solo 184 kb o asi
| Código: | //---------------------------------------------------------------------------
#include <vcl.h>
#include <IdHTTP.hpp>
#include <IdSSLOpenSSL.hpp>
#include <memory>
#include <System.Net.HTTPClientComponent.hpp>
#include <urlmon.h>
#pragma comment (lib, "urlmon.lib")
#pragma comment (lib, "wininet.lib")
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "SHDocVw_OCX"
#pragma resource "*.dfm"
TForm1 *Form1;
#define NOT_IMPLEMENTED { return E_NOTIMPL; }
struct TCallback : IBindStatusCallback
{
TProgressBar* ProgressBar;
//---IBindStatusCallback
STDMETHOD(OnStartBinding)(DWORD dwReserved, IBinding *pib) NOT_IMPLEMENTED
STDMETHOD(GetPriority)(LONG *pnPriority) NOT_IMPLEMENTED
STDMETHOD(OnLowResource)(DWORD reserved) NOT_IMPLEMENTED
STDMETHOD(OnProgress)(ULONG ulProgress, ULONG ulProgressMax,
ULONG ulStatusCode, LPCWSTR wszStatusText)
{
ProgressBar->Max = ulProgressMax;
ProgressBar->Position = ulProgress;
//Opcional: Application->ProcessMessages();
return S_OK;
}
STDMETHOD(OnStopBinding)(HRESULT hresult, LPCWSTR szError) NOT_IMPLEMENTED
STDMETHOD(GetBindInfo)(DWORD *grfBINDF, BINDINFO *pbindinfo) NOT_IMPLEMENTED
STDMETHOD(OnDataAvailable)(DWORD grfBSCF, DWORD dwSize,
FORMATETC *pformatetc, STGMEDIUM *pstgmed) NOT_IMPLEMENTED
STDMETHOD(OnObjectAvailable)(REFIID riid, IUnknown *punk) NOT_IMPLEMENTED
//---IUnknown
STDMETHOD_(ULONG,AddRef)() { return 0; }
STDMETHOD_(ULONG,Release)() { return 0; }
STDMETHOD(QueryInterface)(REFIID riid, void **ppvObject) NOT_IMPLEMENTED
};
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TCallback Callback;
Callback.ProgressBar = ProgressBar1;
// Forma segun ISRA
AnsiString cadena = "C:\\mp3dnl\\";
if(Edit2->Text == "")
{ ShowMessage("debes introducir un nombre para guardar el archivo");
return;
}
cadena = cadena + Edit2->Text;
std::unique_ptr<TNetHTTPClient> http(new TNetHTTPClient(NULL));
std::unique_ptr<TFileStream> fs1(new TFileStream(cadena, fmCreate));
// TFileStream* fs = new TFileStream(cadena + Edit2->Text, fmCreate);
// Download->Get(Edit1->Text, fs);
http->Get(Edit1->Text, fs1.get());
String url = Edit1->Text;
String file = cadena;
// Borrar cache opcionalmente
// Añadir: #pragma comment (lib, "wininet.lib")
DeleteUrlCacheEntry(url.w_str());
URLDownloadToFile(NULL, url.w_str(), file.w_str(), 0, &Callback);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::httpWorkBegin(TObject *ASender, TWorkMode AWorkMode, __int64 AWorkCountMax)
{
ProgressBar1->Position = 0;
ProgressBar1->Max = AWorkCountMax;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::httpWork(TObject *ASender, TWorkMode AWorkMode, __int64 AWorkCount)
{
ProgressBar1->Position = AWorkCount;
ProgressBar1->Refresh();
Application->ProcessMessages();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
TVariant ADDRESS = Edit1->Text;
CppWebBrowser1->Navigate2(ADDRESS);
}
//--------------------------------------------------------------------------- |
crees que puedes corregirme algo Leo??? lo que intento hacer es un downloader de youtube..... el codigo asume que hay una carpeta en C: llamada "mp3dnl" que es donde almacena las descargas |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Dom 03 Jun, 2018 3:13 am Asunto: |
|
|
No, no hay un parche para pasar de la 10.2.2 a la 10.2.3, hay que reinstalar.
Estas mezclando código, el ejemplo de este hilo se refiere a URLDownloadToFile. Las dos versiones que he puesto (preferiblemente la segunda) tienen su ejemplo de uso debajo y están probados con archivos muy grandes en distintos servidores. Prueba en distintos sitios a ver si ves alguna diferencia..
Si vas a usar "TNetHTTPClient" que viene en las versiones actuales tienes su evento "OnReceiveData" para ver el progreso de la descarga. |
|
| Volver arriba |
|
 |
|
|
No puedes publicar temas nuevos en este foro No puedes responder a temas en este foro No puedes editar tus mensajes en este foro No puedes borrar tus mensajes en este foro No puedes votar en las encuestas de este foro
|
© 2002–2026 Club Builder · Funciona con phpBB.
|