基本上,我想将特定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?
答案 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对象返回!