基本上,我想一个特定的URL(基本上,只是在一个字符串形式的HTML代码)的内容下载到我的VB6字符串变量。 不过,也有一定的条件。
我知道的URLDownloadToFile功能 - 但是,这需要你下载的文件/ HTML保存到磁盘上的文件位置,然后才能读入一个字符串变量,这不是我的选择,我不希望这样做。
另一件事是,如果我需要使用一个外部库,它必须已经配备了从XP所有版本的Windows,并起,若为自由故,我不能用,我需要运送,包装,甚至分发控制或库,这是不是一种选择,我不希望这样做。 所以,我不能使用MSINET.OCX(Internet传输)控制的.OpenURL()函数(只是返回内容转换为字符串),因为它没有窗户。
有没有一种方法能够与Windows的API,URLMON还是其他什么东西被预先加载到或自带的Windows,还是有办法做到这一点在VB6(SP6)完全做到这一点?
如果是的话,我将不胜感激方向,因为即使谷歌搜索一小时后,我发现的唯一例子是URLDownloadToFile和MsInet.OpenURL(这要求(即ALE,将它放在字符串之前这需要在磁盘上的保存)引用我船和分发MSINET.OCX,我不能和不想做的)。
当然也一定是一个优雅的方式来做到这一点? 我能做到这一点在VB.NET没有问题,但显然不具备.NET框架中VB6的奢侈品 - 任何想法?
更新:
我发现这一点: http://www.freevbcode.com/ShowCode.asp?ID=1252但是它说,显示的功能可能不是整个页面和链接返回到Microsoft错误报告或知识库文章解释这一点。 另外,我明白这是基于关闭的wininet.dll - 我想知道的Windows版本做的wininet.dll来包装用? Windows XP中和超越? 它配备了Windows 7和/或Windows 8?
如果你想用纯VB,并没有IE要做到这一点,那么你可以采取的VB用户控件的一个很少使用的功能优势 - 异步特性。
创建一个新的用户控件,并调用它像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对象特殊模式!
这就是我如何与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对象库”(工具>引用)。 你也可以使用后期绑定,但说实话,我忘了适当的类名是什么; 也许有人会智能编辑这个答案:-)