直接将URL内容下载到字符串(VB6)而不保存到磁盘

时间:2012-06-10 13:06:35

标签: api winapi vba vb6 wininet

基本上,我想将特定URL的内容(基本上只是字符串形式的HTML代码)下载到我的VB6 String变量中。但是,有一些条件。

我知道URLDownloadToFile函数 - 但是,这需要您将下载的文件/ HTML保存到磁盘上的文件位置,然后才能将其读入String变量,这对我来说不是一个选项,我不想要这样做。

另一件事是,如果我需要使用外部库,它必须已经来自XP及以后的所有版本的Windows,我不能使用我需要发送,打包和分发的控件或库,即使它是免费的,这不是一个选项,我不想这样做。因此,我无法使用MSINET.OCX(Internet传输)控件的.OpenURL()函数(它只是将内容返回到字符串中),因为它没有Windows。

有没有办法能够使用Windows API,URLMON或其他预先加载到Windows中或在Windows中附带的内容,或者完全在VB6(SP6)中执行此操作的方法?

如果是这样,我会很感激方向,因为即使经过一小时的谷歌搜索,我发现的唯一例子是对URLDownloadToFile的引用(需要在放入磁盘之前保存在磁盘上)和MsInet.OpenURL(这需要我发运和分发MSINET.OCX,我不能也不想这样做。

当然必须有一种优雅的方式才能做到这一点?我可以在没有问题的VB.NET中做到这一点,但显然没有VB6中.NET框架的奢侈 - 任何想法?

更新

我找到了这个:http://www.freevbcode.com/ShowCode.asp?ID=1252  但它表示显示的功能可能不会返回整个  页面和指向Microsoft错误报告或kb文章解释的链接  这个。此外,我知道这是基于wininet.dll - 我是  想知道哪个版本的Windows可以打包WinInet.dll  用? Windows XP&超越?它是否附带Windows 7和/或Windows  8?

3 个答案:

答案 0 :(得分:9)

这是我几年前用VB6做的事情:

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

答案 1 :(得分:3)

另一种方法是使用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

编辑:对于上述早期绑定工作,您需要设置对“Microsoft Internet Controls”和“Microsoft HTML Object Library”(工具>参考)的引用。你也可以使用后期绑定,但说实话,我忘记了正确的类名是什么;也许聪明的人会编辑这个答案: - )

答案 2 :(得分:3)

如果你想用纯VB,没有IE,那么你可以利用VB UserControl的一些常用功能 - 异步属性。

创建一个新的UserControl,并将其称为UrlDownloader。将InvisibleAtRuntime属性设置为True。将以下代码添加到其中:

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

要使用此控件,请将其粘贴在表单上并使用以下代码:

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

可以说,您可以根据自己的心灵内容进行自定义。它可以告诉(使用AyncProp对象)文件是否被缓存,以及其他有用的信息。它甚至有一个特殊的模式,你可以下载GIF,JPG和BMP文件并将它们作为StdPicture对象返回!