首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >直接将URL内容下载到字符串(VB6)中,而不保存到磁盘

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

Stack Overflow用户
提问于 2012-06-10 13:06:35
回答 3查看 12.5K关注 0票数 5

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

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

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

是否有一种方法可以通过Windows、URLMON或其他预装到或随Windows附带的东西来完成这一任务,或者是在VB6 (SP6)中完全做到这一点?

如果是这样的话,我会喜欢方向,因为即使在googling搜索了一个小时之后,我发现的唯一例子是对URLDownloadToFile的引用(这需要在被ale保存到字符串之前保存在磁盘上)和MsInet.OpenURL (这要求我发布和分发MSINET.OCX,我不能也不想这么做)。

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

更新:

我发现了这一点:然而,http://www.freevbcode.com/ShowCode.asp?ID=1252说显示的函数可能不会返回整个页面,并链接到Microsoft报告或说明这一点的kb文章。而且,我知道这是基于wininet.dll的-我想知道WinInet.dll附带了哪些版本的WinInet.dll?Windows XP及以外?它是与Windows 7和/或Windows 8配套的吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-11 15:48:41

如果您想使用纯VB,而不使用IE,那么您可以利用VB UserControl -异步属性中很少使用的特性。

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

代码语言:javascript
复制
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

若要使用此控件,请将其粘贴到窗体上,并使用以下代码:

代码语言:javascript
复制
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对象返回!

票数 3
EN

Stack Overflow用户

发布于 2012-06-10 14:34:30

几年前,我就是这样使用VB6的:

代码语言:javascript
复制
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
票数 11
EN

Stack Overflow用户

发布于 2012-06-10 16:39:00

另一种选择是使用Internet。

代码语言:javascript
复制
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对象库“(Tools >Reference)的引用。你也可以使用后期绑定,但老实说,我忘了正确的类名是什么;也许某个聪明人会编辑这个答案:-)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10968946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档