Api 将URL内容直接下载到字符串(VB6)中,无需保存到磁盘

Api 将URL内容直接下载到字符串(VB6)中,无需保存到磁盘,api,winapi,vba,vb6,wininet,Api,Winapi,Vba,Vb6,Wininet,基本上,我想将特定URL的内容(基本上,只是字符串形式的HTML代码)下载到我的VB6字符串变量中。但也有一些条件 我知道URLDownloadToFile函数-但是,这要求您先将下载的文件/HTML保存到磁盘上的文件位置,然后才能将其读入字符串变量,这不是我的选项,我不想这样做 另一件事是,如果我需要使用外部库,它必须已经随XP及以后的所有Windows版本一起提供,我不能使用要求我提供、打包和分发的控件或库,即使它是免费的,这不是一个选项,我也不想这样做。因此,我不能使用MSINET.OCX

基本上,我想将特定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框架的奢华-有什么想法吗

更新:

我发现: 但是,它表示显示的函数可能不会返回整个 页面和指向Microsoft错误报告或知识库文章的链接 这另外,我知道这是基于wininet.dll的,我 想知道WinInet.dll打包了哪些版本的Windows 具有windowsxp&beyond?它是否与Windows 7和/或Windows一起提供
8?

几年前,我就是这样使用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

另一种选择是使用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对象库”(工具>引用)的引用。您也可以使用后期绑定,但老实说,我忘记了正确的类名是什么;也许聪明的人会编辑这个答案:-)

如果你想用纯VB,而不是IE,那么你可以利用VB UserControl-async属性的一些常用功能

创建一个新的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对象返回

您链接的代码修复了internet传输控制中存在的错误;你可以使用它。()代码使用的wininet堆栈是一个核心操作系统组件,存在于Windows 2000及以上版本中。(谷歌搜索InternetReadFile的msdn页面&底部将列出支持的操作系统版本)您可以使用MSXML2.XMLHTTP执行此操作,只需向URL发出GET请求,然后将XMLHTTP.responseText保存到字符串变量中。固有的AsyncRead方法可用,还有WinHTTP。Reg free COM消除了部署简单性方面的大多数问题。我认为没有理由不使用Internet传输控制,但也有其他选择,如呼叫。@Bob Riemersma我可以问一下,什么是Reg free COM吗?听起来很有趣。我也推荐xmlHttp:)感谢heaps antagony,这肯定对很多人有用。向上投票。+1另一个好方法。您可能想切换到latebinding或提及需要将引用添加到IE?谢谢,伙计,这是另一个好主意,尽管我多年使用webbrowser控件的经验,但出于某种原因,我从未想到过:)。还想补充一点,您使用Internet Explorer而不是WebBrowser控件的方法是一个更好的主意,因为WB control将根据您安装的版本使用IE7或IE4,而不使用最新安装的IE版本。但是,当您直接使用IE时,您总是使用安装在客户端计算机上的最新IE版本。再次感谢,投票表决。我只是想说,这是非常有趣的,在这里我想我知道VB6的里里外外和哇-你击中了我这个了不起的解决方案。只是一个问题,我可以把它作为一个用户控制文件包含在我的项目中,对吗?不必编译并引用它作为dll或ocx?(再次感谢,投了赞成票)是的,没错。用户控件只能设置为Public=False。请注意——尽管我在上面提到过,这可能依赖于Internet Explorer附带的组件。如果查看VB6发行说明,它至少需要Internet Explorer 5。它所指的缓存可能是临时Internet文件。也许我应该说“无参考文献”:-。我也觉得这很有趣,但我无法让它按原样工作。它在
RaiseEvent
行的
AsyncProp.Value
上抛出类型不匹配错误。为了让它正常工作,我必须将事件参数更改为变量,并在那里和
Debug.Print
行中删除数组括号。但它当时起了作用,因此+1非常好。:-)嗯,这很奇怪。我从上面的页面中获取了代码,并按照我自己的说明进行了操作——但它似乎没有经过修改就可以工作。我只是再次尝试了一下,这次在XP VM机器上,我不断更新以进行测试,结果完全一样。我们可以吗