Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

IBindStatusCallback::OnProgress Method

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: IBindStatusCallback::OnProgress Method Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Funciona perfecto, muchísimas gracias Leo...
IMPRESIONANTE!!! nada se te resiste...

Increíble la bondad y conocimiento que aportas al foro.
Estoy alucinado... Shocked Shocked Shocked
_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
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


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.