3

基本的に、特定の URL のコンテンツ (基本的には、文字列形式の HTML コードのみ) を VB6 文字列変数にダウンロードしたいと考えています。ただし、いくつかの条件があります。

URLDownloadToFile 関数については知っていますが、ダウンロードしたファイル/HTML を文字列変数に読み込む前に、ディスク上のファイルの場所に保存する必要があります。これは私にとってはオプションではなく、実行したくありません。 .

もう 1 つは、外部ライブラリを使用する必要がある場合は、XP 以降のすべてのバージョンの Windows に既に付属している必要があることです。無料であっても、出荷、パッケージ化、および配布する必要があるコントロールまたはライブラリは使用できません。 、これはオプションではなく、やりたくありません。そのため、MSINET.OCX (インターネット転送) コントロールの .OpenURL() 関数 (単純にコンテンツを文字列に返す) を使用できません。これは Windows に付属していないためです。

Windows API、URLMON、またはWindowsにプリロードされているか付属している何かでこれを行う方法、またはVB6(SP6)で完全に行う方法はありますか?

1 時間のグーグル検索の後でも、私が見つけた唯一の例は 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

これを純粋な 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 に答える
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

EDIT : 上記のアーリー バインディングを機能させるには、「Microsoft Internet Controls」および「Microsoft HTML Object Library」への参照を設定する必要があります ([ツール] > [参照])。遅延バインディングを使用することもできますが、正直なところ、適切なクラス名が何であるかを忘れてしまいました。多分賢い誰かがこの答えを編集するでしょう:-)

于 2012-06-10T16:39:00.710 に答える