DOBON.NET DOBON.NETプログラミング掲示板過去ログ

WebBrowser の履歴&キャッシュの削除

環境/言語:[Windows2000, VisualBasic.NETexpress edition]
分類:[.NET]

お世話になります。
VisualBasic.NET で、WebBrowser をつかってブラウザをつくっています。

InternetExplorer のインターネットオプションにある
「履歴のクリア」と「キャッシュのクリア」のボタンをつけたいとおもっています。

ヘルプにはキャッシュについて、
「WebBrowser コントロールは、最近訪れたサイトの Web ページをローカル ハード ディスク上のキャッシュに格納します。ページごとに、キャッシュ内で存続できる時間を示す有効期限を指定できます。」
とありましたが、どのようにしたらよいかわかりません。

ご教授いただけたらさいわいです。
> InternetExplorer のインターネットオプションにある
> 「履歴のクリア」と「キャッシュのクリア」のボタンをつけたいとおもっています。

このあたりかな。VB6向けの回答ですが、VB.NET でも基本は同じかと。(未確認)
http://hpcgi1.nifty.com/MADIA/VBBBS/wwwlng.cgi?print+200512/05120086.txt
魔界の仮面弁士さん、ありがごうございます。

> このあたりかな。VB6向けの回答ですが、VB.NET でも基本は同じかと。(未確認)
> http://hpcgi1.nifty.com/MADIA/VBBBS/wwwlng.cgi?print+200512/05120086.txt

IUrlHistoryStg2::ClearHistory というものがあるのですね。
がんばってみます。
Minoru です。
IUrlHistoryStg2::ClearHistory を調べているうちに、
WMI というのをみつけました。
これで単純に削除した場合は、結果はおなじになるのでしょうか。

Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim objShell As Object
Dim strCookiesPath As String
Dim strTmpPath As String
Dim strHistoryPath As String

objShell = CreateObject("Shell.Application")

'TEMPORARY_INTERNET_FILES
strTmpPath = objShell.Namespace(&H20).self.path
'COOKIES
strCookiesPath = objShell.Namespace(&H21).self.path
'HISTORY
strHistoryPath = objShell.Namespace(&H22).self.path

MsgBox(strTmpPath)
MsgBox(strCookiesPath)
MsgBox(strHistoryPath)

End Sub
End Class
> IUrlHistoryStg2::ClearHistory を調べているうちに、
> WMI というのをみつけました。
あ、WMI にも削除命令がありましたか。
それは WMI の、どのクラスの何メソッドですか?


> これで単純に削除した場合は、結果はおなじになるのでしょうか。
それは、試してみればわかりますよね。


> objShell = CreateObject("Shell.Application")
これは、COMの Shellオブジェクトであって、WMI では無いですよね。
COM なので、Marshal.ReleaseComObject() の呼び出しが必要かと。

それに、これらはパスを調べるだけなので、履歴の削除には使えないかも。
(物理ファイルを単純に削除すればよいという物では無いですし)
魔界の仮面弁士さん、いろいろありがとうございます。

> あ、WMI にも削除命令がありましたか。
こちらの勘違いのようでした。すみませんでした。

> (物理ファイルを単純に削除すればよいという物では無いですし)

おっしゃるとおりのようです。
魔界の仮面弁士さんのコード、がんばって再度取り組みます。
お世話になっております。

魔界の仮面弁士さんにおしえていただいたコードで、
以下のとおり、VB をつかって作成できました。

Option Explicit

Private Type UUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(0 To 7) As Byte
End Type

Private Declare Function CoCreateInstance Lib "OLE32" _
(ByRef rclsid As UUID, _
ByVal pUnkOuter As Long, _
ByVal dwClsContext As Long, _
ByRef riid As UUID, _
ByRef ppv As Long) As Long

Private Declare Function DispCallFunc Lib "OLEAUT32" _
(ByVal pvInstance As Long, _
ByVal oVft As Long, _
ByVal CallConv As Long, _
ByVal vtReturn As VbVarType, _
ByVal cActuals As Long, _
ByRef prgvt As Integer, _
ByRef prgpvarg As Long, _
ByRef pvargResult As Variant) As Long

Private Const CLSCTX_INPROC = &H1& Or &H2&
Private Const CC_STDCALL = 4

Public Enum eVtblFunctionOffsetCUrlHistory
vtblOffsetAddUrlAndNotify = 32 '6 Args
vtblOffsetClearHistory = 36 '0 Arg
vtblOffsetAddUrl = 12 '3 Args
vtblOffsetDeleteUrl = 16 '2 Args
vtblOffsetQueryUrl = 20 '3 Args
vtblOffsetBindToObject = 24 '3 Args
vtblOffsetEnumUrls = 28 '1 Arg
vtblOffsetQueryInterface = 0 '2 Args
vtblOffsetAddRef = 4 '0 Arg
vtblOffsetRelease = 8 '0 Arg
End Enum

Private Function CLSID_CUrlHistory() As UUID
With CLSID_CUrlHistory
.Data1 = &H3C374A40
.Data2 = &HBAE4
.Data3 = &H11CF
.Data4(0) = &HBF
.Data4(1) = &H7D
.Data4(2) = &H0
.Data4(3) = &HAA
.Data4(4) = &H0
.Data4(5) = &H69
.Data4(6) = &H46
.Data4(7) = &HEE
End With
End Function

Private Function IID_IUrlHistoryStg() As UUID
With IID_IUrlHistoryStg2
.Data1 = &HAFA0DC11
.Data2 = &HC313
.Data3 = &H11D0
.Data4(0) = &H83
.Data4(1) = &H1A
.Data4(2) = &H0
.Data4(3) = &HC0
.Data4(4) = &H4F
.Data4(5) = &HD5
.Data4(6) = &HAE
.Data4(7) = &H38
End With
End Function

Private Function IID_IUrlHistoryStg2() As UUID
With IID_IUrlHistoryStg2
.Data1 = &HAFA0DC11
.Data2 = &HC313
.Data3 = &H11D0
.Data4(0) = &H83
.Data4(1) = &H1A
.Data4(2) = &H0
.Data4(3) = &HC0
.Data4(4) = &H4F
.Data4(5) = &HD5
.Data4(6) = &HAE
.Data4(7) = &H38
End With
End Function

Public Sub DelHistory()

Dim hr As Long
Dim udtCUrlHistory As UUID
Dim udtIUrlHistoryStg2 As UUID
Dim lngPUrlHistoryStg2 As Long
Dim lngPArgs() As Long
Dim intVtArgs() As Integer
Dim varResult As Variant

udtCUrlHistory = CLSID_CUrlHistory
udtIUrlHistoryStg2 = IID_IUrlHistoryStg2

hr = CoCreateInstance _
(udtCUrlHistory, _
0&, _
CLSCTX_INPROC, _
udtIUrlHistoryStg2, _
lngPUrlHistoryStg2)

If hr <> 0& Then
Debug.Print Err.LastDllError
Err.Raise hr
Else
ReDim lngPArgs(0)
ReDim intVtArgs(0)
hr = DispCallFunc _
(lngPUrlHistoryStg2, _
vtblOffsetClearHistory, _
CC_STDCALL, _
vbLong, _
0, _
intVtArgs(0), _
lngPArgs(0), _
varResult)

ReDim lngPArgs(0)
ReDim intVtArgs(0)
hr = DispCallFunc _
(lngPUrlHistoryStg2, _
vtblOffsetRelease, _
CC_STDCALL, _
vbLong, _
0, _
intVtArgs(0), _
lngPArgs(0), _
varResult)
End If
End Sub

Private Sub Form_Load()
Me.Visible = False
DelHistory
End
End Sub

ところが、これを VB.NET に書き換えることがどうにも...できません。
さいしょの UUID からつまづいてしまいます。

苦肉の策として、さきほどの VB では、フォームを非表示にして、
コマンドもどきにして、つかえるようにしましたが...。

お教えいただけたらさいわいです。
> ところが、これを VB.NET に書き換えることがどうにも...できません。

とりあえず、VB2005 なコンソールアプリとして書いてみました。


Imports System.Runtime.InteropServices
Public Module Module1

    Public Sub Main()
        Dim H As New UrlHistoryImpl()
        H.ClearHistory()
        If Marshal.IsComObject(H) Then
            Marshal.ReleaseComObject(H)
        End If
    End Sub

    <ComImport(), Guid("3C374A40-BAE4-11CF-BF7D-00AA006946EE")> _
    Public Class UrlHistoryImpl
        Implements IUrlHistoryStg2
        Public Sub AddUrl(ByVal pocsUrl As String, ByVal pocsTitle As String, ByVal dwFlags As UInteger) Implements IUrlHistoryStg.AddUrl, IUrlHistoryStg2.AddUrl
        End Sub
        Public Sub BindToObject(ByVal pocsUrl As String, ByRef riid As System.Guid, ByRef ppvOut As Object) Implements IUrlHistoryStg.BindToObject, IUrlHistoryStg2.BindToObject
        End Sub
        Public Sub DeleteUrl(ByVal pocsUrl As String, ByVal dwFlags As UInteger) Implements IUrlHistoryStg.DeleteUrl, IUrlHistoryStg2.DeleteUrl
        End Sub
        Public Function EnumUrls() As IEnumSTATURL Implements IUrlHistoryStg.EnumUrls, IUrlHistoryStg2.EnumUrls
        End Function
        Public Sub QueryUrl(ByVal pocsUrl As String, ByVal dwFlags As UInteger, ByRef lpSTATURL As STATURL) Implements IUrlHistoryStg.QueryUrl, IUrlHistoryStg2.QueryUrl
        End Sub
        Public Sub AddUrlAndNotify(ByVal pocsUrl As String, ByVal pocsTitle As String, ByVal dwFlags As UInteger, ByVal fWriteHistory As Boolean, ByVal poctNotify As Object, ByVal punkISFolder As Object) Implements IUrlHistoryStg2.AddUrlAndNotify
        End Sub
        Public Sub ClearHistory() Implements IUrlHistoryStg2.ClearHistory
        End Sub
    End Class

    Public Structure STATURL
        Public Shared SIZEOF_STATURL As UInteger = CUInt(Marshal.SizeOf(GetType(STATURL)))
        Public cbSize As UInteger
        <MarshalAs(UnmanagedType.LPWStr)> Public pwcsUrl As String
        <MarshalAs(UnmanagedType.LPWStr)> Public pwcsTitle As String
        Public ftLastVisited, ftLastUpdated, ftExpires As ComTypes.FILETIME
        Public dwFlags As UInteger
    End Structure

    <ComImport(), Guid("3C374A42-BAE4-11CF-BF7D-00AA006946EE"), _
    InterfaceType(ComInterfaceType.InterfaceIsIUnknown)> _
    Public Interface IEnumSTATURL
        <PreserveSig()> Function [Next]( _
            ByVal celt As UInteger, _
            <Out()> ByVal rgelt As STATURL, _
            <Out()> ByVal pceltFetched As UInteger _
        ) As UInteger
        Sub Skip( _
            ByVal celt As UInteger _
        )
        Sub Reset()
        Sub Clone( _
            <Out()> ByVal ppenum As IEnumSTATURL _
        )
        Sub SetFilter( _
            <MarshalAs(UnmanagedType.LPWStr)> ByVal poszFilter As String, _
            ByVal dwFlags As UInteger _
        )
    End Interface

    <ComImport(), Guid("3C374A41-BAE4-11CF-BF7D-00AA006946EE"), _
     InterfaceType(ComInterfaceType.InterfaceIsIUnknown)> _
    Public Interface IUrlHistoryStg
        Sub AddUrl( _
            <MarshalAs(UnmanagedType.LPWStr)> ByVal pocsUrl As String, _
            <MarshalAs(UnmanagedType.LPWStr)> ByVal pocsTitle As String, _
            ByVal dwFlags As UInteger _
        )
        Sub DeleteUrl( _
            <MarshalAs(UnmanagedType.LPWStr)> ByVal pocsUrl As String, _
            ByVal dwFlags As UInteger _
        )
        Sub QueryUrl( _
            <MarshalAs(UnmanagedType.LPWStr)> ByVal pocsUrl As String, _
            ByVal dwFlags As UInteger, _
            ByRef lpSTATURL As STATURL _
        )
        Sub BindToObject( _
            <MarshalAs(UnmanagedType.LPWStr)> ByVal pocsUrl As String, _
            <[In]()> ByRef riid As Guid, _
            <Out(), MarshalAs(UnmanagedType.IUnknown)> ByRef ppvOut As Object _
        )
        Function EnumUrls() As IEnumSTATURL
    End Interface

    <ComImport(), Guid("AFA0DC11-C313-11D0-831A-00C04FD5AE38"), _
     InterfaceType(ComInterfaceType.InterfaceIsIUnknown)> _
    Public Interface IUrlHistoryStg2
        Inherits IUrlHistoryStg
#Region " IUrlHistoryStg のメソッド"
        Shadows Sub AddUrl( _
            <MarshalAs(UnmanagedType.LPWStr)> ByVal pocsUrl As String, _
            <MarshalAs(UnmanagedType.LPWStr)> ByVal pocsTitle As String, _
            ByVal dwFlags As UInteger _
        )
        Shadows Sub DeleteUrl( _
            <MarshalAs(UnmanagedType.LPWStr)> ByVal pocsUrl As String, _
            ByVal dwFlags As UInteger _
        )
        Shadows Sub QueryUrl( _
            <MarshalAs(UnmanagedType.LPWStr)> ByVal pocsUrl As String, _
            ByVal dwFlags As UInteger, _
            ByRef lpSTATURL As STATURL _
        )
        Shadows Sub BindToObject( _
            <MarshalAs(UnmanagedType.LPWStr)> ByVal pocsUrl As String, _
            <[In]()> ByRef riid As Guid, _
            <Out(), MarshalAs(UnmanagedType.IUnknown)> ByRef ppvOut As Object _
        )
        Shadows Function EnumUrls() As IEnumSTATURL
#End Region
        Sub AddUrlAndNotify( _
            <MarshalAs(UnmanagedType.LPWStr)> ByVal pocsUrl As String, _
            <MarshalAs(UnmanagedType.LPWStr)> ByVal pocsTitle As String, _
            ByVal dwFlags As UInteger, _
            <MarshalAs(UnmanagedType.Bool)> ByVal fWriteHistory As Boolean, _
            <MarshalAs(UnmanagedType.IUnknown)> ByVal poctNotify As Object, _
            <MarshalAs(UnmanagedType.IUnknown)> ByVal punkISFolder As Object _
        )
        Sub ClearHistory()
    End Interface

End Module
魔界の仮面弁士さん、本当にどうもありがとうございました。

このサンプルは、まさにもとめていたものでした。
魔界の仮面弁士さんのおかげで、
履歴の削除を実装することができました。

それにしても、あまりの違いに目が点になっています。
すこしでも理解したいとおもって、がんばって読んでいます。

< > でくくられている部分がたくさんありますが、
これが「属性」とよばれるものでしょうか...。

まずはお礼まで。
解決済み!
2006/06/03(Sat) 18:05:01 編集(投稿者)

> それにしても、あまりの違いに目が点になっています。
これは、両者の処理ロジック自体が別物だからです。

一般的な組み方では、IUrlHistoryStg2 インターフェイスを定義した
「タイプライブラリ」を用意して、それを参照設定します。その場合は
<VB.NET>
  Dim HistoryStg As IUrlHistoryStg2
  HistoryStg = New UrlHistoryClass()
  HistoryStg.ClearHistory()
  Marshal.ReleaseComObject(HistoryStg)

<VB6>
  Dim HistoryStg As IUrlHistoryStg2
  Set HistoryStg = New UrlHistory
  HistoryStg.ClearHistory
  Set HistoryStg = Nothing
などといった、わずか数行のコードで履歴を削除できてしまいます。
最終的に行っている事は、どちらも IUrlHistoryStg2.ClearHistory メソッドの
呼び出しであり、この方法においては、両者の違いはわずかですよね。


ところが、参照設定用のファイルが提供されていない場合は、自分でその
インターフェイス定義を記述しなければなりません。それが先の
> Public Interface IUrlHistoryStg2
といった VB.NET のコードに相当しているというわけです。

問題は VB6 で……こちらは言語仕様上、インターフェイスを定義できません。
(インターフェイスを「利用」する事はできるのですけれども)

そこで VB6 版では、COM オブジェクトを操作するための低レベル API を
直接呼び出す事で、同等の処理を行わせています。(たとえば、「New」で
オブジェクトを作成するかわりに、CoCreateInstance API で生成するなど)


> < > でくくられている部分がたくさんありますが、
> これが「属性」とよばれるものでしょうか...。
ですね。
解決済み!
わかりやすい説明、ほんとうにありがとうございます。
ネットを検索していると、魔界の仮面弁士さんのご活躍に敬服します。
Edanmo さんの

Edanmo's VB Page:
http://www.domaindlx.com/e_morcillo/

にタイプライブラリがあることがわかりましたが、上記ページは閉鎖されていました。
しらべたところ、

Namespace Edanmo
http://www.mvps.org/emorcillo/

というページがあり、こちらの
http://www.mvps.org/emorcillo/download/vb6/
に、tl_ole.zip ほか、もろもろのタイプライブラリがありました。
(ディレクトリが vb6 なのが気になります)

VB5 だと、zip を解凍したあと、c:\windows\system32 に移動して、
VB5 のメニュー「プロジェクト」−「参照設定」−「参照」から、
tl_ole の中の olelib.tlb を選択すると、
参照可能なライブラリファイルの一覧に、
Edamo's OLE interfaces & function v1.81 と表示されて、

Private Sub Form_Load()
Dim HistoryStg As IUrlHistoryStg2
  Set HistoryStg = New UrlHistory
  HistoryStg.ClearHistory
  Set HistoryStg = Nothing
End Sub

魔界の仮面弁士さんのおっしゃるとおり、これだけで、作成できてしまって、おどろいています。

ただ、これを VB.NET で参照設定したいのですが、どこに参照設定のメニューがあるのか、ヘルプをみてもよくわかりません。よろしければお教えいただけますでしょうか。
どうも、VisualBasic 2005 Express Edition には、起動直後に「プロジェクト」メニューが表示されないので、おかしいなとおもいましたが、新しいプロジェクトを起動すると「プロジェクト」メニューが現れました。どうもお騒がせしました。

「ファイル」−「新しいプロジェクト」でコンソールアプリケーションを選択。
メニューの「プロジェクト」−「参照の追加」で、「参照」タブをクリックし、
ファイルの場所で、c:\windows\system32\tl_ole\olelib.tlb
を指定すると、プロジェクトエクスプローラで参照設定に Edanmo's OLE interfaces & functions v1.81 が追加されているのがわかりました。

Module Module1
 Sub Main()
  Dim HistoryStg As olelib.IUrlHistoryStg2
  HistoryStg = New olelib.UrlHistoryClass()
  HistoryStg.ClearHistory()
  System.Runtime.InteropServices.Marshal.ReleaseComObject(HistoryStg)
 End Sub
End Module

としたら、無事に動作させることができました。

魔界の仮面弁士さん、本当になにからなにまでお教えいただきありがとうございました。
可能性がとてもひろがったようにおもいます。わからないことばかりで、これからもお世話になることとおもいますが、どうかよろしくおねがいします。

DOBON.NET | プログラミング道 | プログラミング掲示板