3

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

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

另一件事是,如果我需要使用外部库,它必须已经从 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 - 我想知道 WinInet.dll 与哪些版本的 Windows 一起打包?Windows XP 及更高版本?它是否与 Windows 7 和/或 Windows 8 一起提供?

4

3 回答 3

10

这就是我几年前使用 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
于 2012-06-10T14:34:30.850 回答
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 控件”和“Microsoft HTML 对象库”(工具 > 参考)的引用。您也可以使用后期绑定,但老实说,我忘记了正确的类名是什么;也许聪明的人会编辑这个答案:-)

于 2012-06-10T16:39:00.710 回答
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 对象返回!

于 2012-06-11T15:48:41.947 回答