urldownloadtofile api winapi vba vb6 wininet

api - urldownloadtofile vb6



Descargar contenido de URL directamente en String(VB6) SIN guardar en disco (3)

Básicamente, quiero descargar el contenido de una URL en particular (básicamente, solo códigos HTML en forma de String) en mi variable VB6 String. Sin embargo, hay algunas condiciones.

Sé sobre la función URLDownloadToFile - sin embargo, esto requiere que guarde el archivo / HTML descargado en una ubicación de archivo en el disco antes de poder leerlo en una variable String, esta no es una opción para mí y no quiero hacer esto. .

La otra cosa es que, si necesito usar una biblioteca externa, ya debe venir con todas las versiones de Windows desde XP y en adelante, no puedo usar un control o biblioteca que deba enviar, empaquetar y distribuir, incluso si es gratis. , esta no es una opción y no quiero hacer esto. Por lo tanto, no puedo usar la función .OpenURL () del Control MSINET.OCX (Transferencia de Internet) (que simplemente devuelve contenido en una Cadena), ya que no viene con Windows.

¿Hay alguna forma de poder hacer esto con la API de Windows, URLMON o alguna otra cosa precargada o incluida con Windows, o una forma de hacerlo en VB6 (SP6) por completo?

Si es así, apreciaría la dirección, porque incluso después de una hora de búsqueda en Google, los únicos ejemplos que he encontrado son referencias a URLDownloadToFile (que requiere guardar en el disco antes de ser ale para colocar en una cadena) y MsInet.OpenURL (que requiere que Envío y distribuyo MSINET.OCX, lo cual no puedo y no quiero hacer).

Seguramente tiene que haber una manera elegante de poder hacer esto? Puedo hacerlo en VB.NET sin problemas, pero obviamente no tengo el lujo del .NET framework en VB6, ¿alguna idea?

Actualizar:

He encontrado esto: http://www.freevbcode.com/ShowCode.asp?ID=1252, sin embargo, dice que la función que se muestra no puede devolver toda la página y los enlaces a un informe de error de Microsoft o artículo kb explicando esto. Además, entiendo que esto se basa en wininet.dll, y me pregunto en qué versiones de Windows viene empaquetado WinInet.dll. Windows XP y más? ¿Viene con Windows 7 y / o Windows 8?


Así es como lo hice con VB6 hace unos años:

Private Function GetHTMLSource(ByVal sURL As String) As String Dim xmlHttp As Object Set xmlHttp = CreateObject("MSXML2.XmlHttp") xmlHttp.Open "GET", sURL, False xmlHttp.send GetHTMLSource = xmlHttp.responseText Set xmlHttp = Nothing End Function


Si desea hacer esto con VB puro, y sin IE, entonces puede aprovechar las características poco utilizadas de VB UserControl - async properties.

Crea un nuevo UserControl y llámalo algo así como UrlDownloader. Establezca la propiedad InvisibleAtRuntime en True. Agregue el siguiente código:

Option Explicit Private Const m_ksProp_Data As String = "Data" Private m_bAsync As Boolean Private m_sURL As String Public Event AsyncReadProgress(ByRef the_abytData() As Byte) Public Event AsyncReadComplete(ByRef the_abytData() As Byte) Public Property Let Async(ByVal the_bValue As Boolean) m_bAsync = the_bValue End Property Public Property Get Async() As Boolean Async = m_bAsync End Property Public Property Let URL(ByVal the_sValue As String) m_sURL = the_sValue End Property Public Property Get URL() As String URL = m_sURL End Property Public Sub Download() UserControl.AsyncRead m_sURL, vbAsyncTypeByteArray, m_ksProp_Data, IIf(m_bAsync, 0&, vbAsyncReadSynchronousDownload) End Sub Private Sub UserControl_AsyncReadComplete(AsyncProp As AsyncProperty) If AsyncProp.PropertyName = m_ksProp_Data Then RaiseEvent AsyncReadComplete(AsyncProp.Value) End If End Sub Private Sub UserControl_AsyncReadProgress(AsyncProp As AsyncProperty) If AsyncProp.PropertyName = m_ksProp_Data Then Select Case AsyncProp.StatusCode Case vbAsyncStatusCodeBeginDownloadData, vbAsyncStatusCodeDownloadingData, vbAsyncStatusCodeEndDownloadData RaiseEvent AsyncReadProgress(AsyncProp.Value) End Select End If End Sub

Para usar este control, pégalo en un formulario y usa el siguiente código:

Option Explicit Private Sub Command1_Click() XDownload1.Async = False XDownload1.URL = "http://www.google.co.uk" XDownload1.Download End Sub Private Sub XDownload1_AsyncReadProgress(the_abytData() As Byte) Debug.Print StrConv(the_abytData(), vbUnicode) End Sub

Basta decir que puedes personalizar esto al contenido de tu corazón. Puede indicar (utilizando el objeto AyncProp) si el archivo está en caché y otra información útil. Incluso tiene un modo especial en el que puedes descargar archivos GIF, JPG y BMP y devolverlos como un objeto StdPicture.


Una alternativa es usar Internet Explorer.

Dim ex As InternetExplorer Dim hd As HTMLDocument Dim s As String Set ex = New InternetExplorer With ex .Navigate "http://donttrack.us/" .Visible = 1 Set hd = .Document s = hd.body.innerText '' assuming you just want the text ''s = hd.body.innerHTML '' if you want the HTML End With

EDITAR : Para que la vinculación anticipada anterior funcione, debe establecer referencias a "Microsoft Internet Controls" y "Microsoft HTML Object Library" (Herramientas> Referencias). También podría usar el enlace tardío, pero para ser honesto, olvidé cuáles son los nombres de clase correctos; tal vez alguien inteligente editará esta respuesta :-)