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 :-)