「WebBrowser」でソースコードを取得するには?

[戻る]
ポント 2003/10/06(月) 14:00:38
お世話になっております。「WebBrowser」についての質問です。 

「WebBrowser」コントロールから、現在表示されているページのソースコードを取得するには、どのようにすればよいのですか? 
(WebBrowserのContainerプロパティのinnerHTMLなどから一応ソースコードは取れそうなのですが、スペースや改行などが自動的に組みかえられていて、もとのソースコードとは配置が異なっていて、埒が明きませんでした。もとのソースコードそのものを取得したいのですが、お教え願います。) 

ご教授よろしくお願いします。 

スポンサーリンク

魔界の仮面弁士 2003/10/06(月) 14:12:19
IPersistFileインターフェイスのSaveメソッドを使う必要があります。 

Dim oPF As IPersistFile 
Set oPF = WebBrowser1.Document 
oPF.Save "source.htm", False 

なお、WebBrowserコントロールのファイルには、 
IPersistFileインターフェイス用のタイプライブラリが 
含まれていませんので、別途、参照設定が必要です。 

ポント 2003/10/08(水) 22:12:25
IPersistFileは「参照設定」のどの項目に含まれているのですか? 

> IPersistFileインターフェイスのSaveメソッドを使う必要があります。 
一度テンポラリファイルに保存するという過程を踏まなければならないということですか? 

魔界の仮面弁士 2003/10/08(水) 22:29:11
> IPersistFileは「参照設定」のどの項目に含まれているのですか? 
残念ながら、VB用の標準的なライブラリは用意されていません。 

ですから MKTYPLIB.EXEなどを使って、*.TLBファイルを自作するか、 
もしくは他の方が作られた物を探して、それを利用する事になるでしょう。 
私の作った物でも良ければ、下記に含まれる SHELLLNK.TLB ファイルも利用できます。 
http://www.ocv.ne.jp/~oratorio/windev/vb/CreateShortcut.CAB 


> 一度テンポラリファイルに保存するという過程を踏まなければならないということですか? 
という事になりますかね。IEの「ソースの表示」も、一時ファイルを吐いていますし。 

魔界の仮面弁士 2003/10/08(水) 22:37:10
ちなみに、タイプライブラリを使わず、COM APIを直接呼び出すのであれば、こんな感じになります。 

Private Sub Command1_Click() 
    If TypeName(WebBrowser1.Document) = "HTMLDocument" Then 
        With New PersistFile 
            .SetObject Me.WebBrowser1.Document 
            .Save "C:\TEST.HTML", False 
        End With 
    End If 
End Sub 


'===== クラスモジュールを追加し、クラス名を PersistFile という名前にしてから、 
'===== そこに下記のコードを記述してください。 
Option Explicit 

Private Type UUID 
   Data1 As Long 
   Data2 As Integer 
   Data3 As Integer 
   Data4(7) As Byte 
End Type 
Private mudtIPersistFile As UUID    'IID_IPersistFileの格納用 

Private Const autCCStdCall = 4 
Private Declare Function DispCallFunc Lib "oleaut32" _ 
   (ByVal pvInstance As Long, _ 
    ByVal oVft As Long, _ 
    ByVal CallConv As Integer, _ 
    ByVal vtReturn As Integer, _ 
    ByVal cActuals As Long, _ 
    ByRef prgvt As Integer, _ 
    ByRef prgpvarg As Long, _ 
    ByRef pvargResult As Variant _ 
) As Long 

Private mobjSource As Object 
Private mlpPersistFile As Long 

'メソッドの位置 
Private Const comIUnknown_QueryInterface = 0 
Private Const comIUnknown_Release = 8 
Private Const comIPersistFile_Save = 24 

Private Sub Class_Initialize() 
    '{0000010b-0000-0000-C000-000000000046} 
    With mudtIPersistFile 
        .Data1 = &H10B 
        .Data4(0) = &HC0 
        .Data4(7) = &H46 
    End With 
End Sub 

Public Sub SetObject(ByVal Source As Object) 
    Set mobjSource = Source 
    If Source Is Nothing Then 
        mlpPersistFile = 0 
    Else 
        Dim hResult As Long 

        If mlpPersistFile <> 0 Then 
            Call Invoke_(mlpPersistFile, comIUnknown_Release) 
            mlpPersistFile = 0 
        End If 

        hResult = Invoke_(ObjPtr(Source), comIUnknown_QueryInterface, _ 
                    VarPtr(mudtIPersistFile), VarPtr(mlpPersistFile)) 
        If hResult < 0 Then 
            mlpPersistFile = 0 
            Err.Raise hResult 
        End If 
    End If 
End Sub 

Public Sub Save(ByVal pszFileName As String, ByVal fRemember As Boolean) 
    Dim bytFileName() As Byte 
    Dim hResult As Long 
    Dim lngBool As Long 

    If mlpPersistFile = 0 Then 
        'オブジェクト変数またはWithブロック変数が設定されていません。 
        Err.Raise 91 
        Exit Sub 
    End If 

    bytFileName = pszFileName & vbNullChar 
    lngBool = IIf(fRemember, 1&, 0&) 

    hResult = Invoke_(mlpPersistFile, comIPersistFile_Save, _ 
                        VarPtr(bytFileName(0)), lngBool) 
    If hResult <> 0 Then 
        Err.Raise hResult 
    End If 
End Sub 

Private Function Invoke_(ByVal lpObject As Long, ByVal VtblOffset As Long, _ 
                         ParamArray Args() As Variant) As Long 
    Dim lngPtArgs() As Long 
    Dim intVtArgs() As Integer 
    Dim varResult As Variant 
    Dim lngArgs As Long 
    Dim n As Long 

    If lpObject = 0 Then 
        Exit Function 
    End If 

    lngArgs = UBound(Args) - LBound(Args) + 1 
    If lngArgs = 0 Then 
        ReDim lngPtArgs(0), intVtArgs(0) 
    Else 
        ReDim lngPtArgs(lngArgs - 1), intVtArgs(lngArgs - 1) 
        For n = 0 To lngArgs - 1 
            intVtArgs(n) = VarType(Args(n)) 
            lngPtArgs(n) = VarPtr(Args(n)) 
        Next 
    End If 

    n = 0 
    n = DispCallFunc(lpObject, VtblOffset, autCCStdCall, _ 
            vbLong, lngArgs, intVtArgs(0), lngPtArgs(0), varResult) 
    If n >= 0 Then 
        Invoke_ = CLng(varResult) 
    End If 
End Function 

Private Sub Class_Terminate() 
    Call Invoke_(mlpPersistFile, comIUnknown_Release) 
    mlpPersistFile = 0 
    Set mobjSource = Nothing 
End Sub 

ポント 2003/10/09(木) 00:59:19
直ぐのレスに非常に感謝しています。更に、お詳しいご説明をお付け加えしていただけて、感謝の限りです。 

タイプライブラリの方も、COM APIの方も、やってみます。 

ポント 2003/10/12(日) 16:24:00
[[解決]]
遅くなってすみませんでした。 

ありがとうございました。ばっちりソースを取得できるようになってました。自分ひとりでは絶対解決できませんでした。感謝の気持ちでいっぱいです。 

スポンサーリンク

追加発言(4ヶ月以上古い記事に書き込めません。)
■ お名前(ペンネーム可)
  
■ メールアドレス(省略可、半角で入力)
  
■ ホームページアドレス(省略可、半角で入力)
  
■ 発言(エラー時再送信禁止)
  ←解決時は質問者本人がここをチェックしてください。
  
■ 書き込み認証キーを入力して下さい(下記のキーを指定して下さい)
  認証キー :   
  認証キー(確認入力用) :   
■ あなたのランクを選択して下さい(省略可)
   なし   初心者    中級者    上級者    常連    IP表示

  

Programming Library