【解決したら500ポイント】VisualBasic2005ExpressEditionを使っています。


WebBrowserコントロールを使ってブラウザもどきをつくりいろいろと勉強いているのですが一時キャッシュのオン・オフを制御したいと思っています。
※チェックボックにチェックを入れている間はキャッシュを利用してブラウジングし、チェックをはずしている場合は、キャッシュを利用しないでブラウジングするみたいな感じです。

いろいろネットを検索するとAPIを使えばできるようなことが書いてありますが、ソースを貼り付けたりしてもエラーになるだけで一向に進めません。

キャッシュのオン・オフを制御する方法を教えてください。

なお、キャッシュのオン・オフを制御できないのであればキャッシュファイルの削除方法を教えてください。

なお、私超初心者です。。。

今回は、解決にたどりつけた解答を提示いただいた方に500ポイントを差し上げます。

※内容と残高しだいでその他の方にもポイントを差し上げます

よろしくお願いします。

回答の条件
  • 1人5回まで
  • 登録:2007/10/05 21:54:30
  • 終了:2007/10/12 21:55:04

回答(4件)

id:KUROX No.1

KUROX回答回数3542ベストアンサー獲得回数1402007/10/05 22:44:20

ポイント23pt

長いですが最後まで読めば解決すると思います。

http://dobon.net/vb/bbs/log3-27/15894.html

id:curd

うーん、この手の情報は全部試したんですが・・・

最後のほうで紹介されているtl_ole?なるものも、内容は理解できないのですが、ダウンロードしてプロジェクトから参照してみましたが、エラーがでてしまいお手上げです・・・

※有効なCOMなんたらであることを確認してください、みたいなエラーがでています・・・

WindowsVistaが問題なのでしょうか???

2007/10/05 23:13:15
id:ardarim No.2

ardarim回答回数892ベストアンサー獲得回数1422007/10/06 01:58:43

ポイント23pt

こちらにサンプルコードが載ってますので参考にしてみてはいかがでしょうか。

YAS's VB.NET Tips: WebBrowserコントロールを制御する


サンプルは画像を表示する/しないの制御ですが、同じ方法でオフライン作業モード(キャッシュから表示するか、オンラインから取ってくるか)の切り替えを行えます。


サンプルでは Button1_Click で「画像を表示しない」にしています。これは、Me.WebBrowerCtrl.DlControl から、DLCTL.DLIMAGES ビットをクリア(And Not)することで実現しています。

Button2_Click で「画像を表示する」です。表示しないとは逆で、Me.WebBrowerCtrl.DlControl に DLCTL.DLIMAGES ビットを追加(Or)しています。

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Me.WebBrowerCtrl.DlControl = Me.WebBrowerCtrl.DlControl And Not DLCTL.DLIMAGES
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Me.WebBrowerCtrl.DlControl = Me.WebBrowerCtrl.DlControl Or DLCTL.DLIMAGES
    End Sub


オフライン作業モードであれば、DLCTL.DLIMAGES の代わりに DLCTL.OFFLINE に置き換えればそのまま使えるかと思います。

id:curd

ご回答ありがとうございます。

ご紹介の設定は、恐らく、オンライン作業とオフライン作業を切り替えるものだと思います。

私が今困っているのは、

そのオンライン作業の中でキャッシュのデータを利用したくない(または、キャッシュの中身を空にする)方法を探しています。

IEだとキャッシュサイズは0にはできないため、恐らくは使用しないというのは難しいと思うのですが、削除方法はあるとおもうんです。

でも、いろいろネットの情報を利用してもうまくいかない(VB2005では使用が若干違う?)為、質問しております。

ご回答ありがとうございました。

2007/10/06 12:34:36
id:ardarim No.3

ardarim回答回数892ベストアンサー獲得回数1422007/10/06 21:10:30

ポイント22pt

質問の意図を間違っていたようですみません。


キャッシュをクリアしたいだけであれば、下記のコードで実現できるはずです。

アプリケーションが WebBrowser コントロールをホストする場合、キャッシュを消去する方法。 (Microsoft)

説明中、「Internet Explorer 5 で使用のみできましたので~」とありますが、これはかなり昔に公開された情報のためです(IE4以前では使えないという意味)。IE5以降であればIE6でもIE7でも同じやり方です。


またキャッシュを完全に無効にはできませんが、必ず毎回サーバに取りに行く設定は可能です(キャッシュには保存されるが、キャッシュを優先しない)。

これはコンパネのインターネットオプションで「全般」→「インターネット一時ファイル」→「設定」で「ページを表示するごとに確認する」を選択することで実現します。レジストリ操作で行う場合は次のレジストリです。

[HKEY_CURRENT_USER\SOFTWARE\Microsoft\windows\CurrentVersion\Internet Settings]
"SyncMode5"=dword:3

SyncMode5の値とインターネットオプションでの選択の関連は次のとおり。

0: 確認しない
2: Internet Explorerを起動するごとに確認する
3: ページを表示するごとに確認する
4: 自動的に確認する(デフォルト)
id:curd

なるほど。。。

コメントに対する回答あわせていたしますが、

なぜか、VB2005ではだめっぽいです・・・

VB6とはAPIの呼び出し方法が違うのかもしれません・・・

VB6とかはWindowsAPIを直接読んでいて、VB2005では.Netフレームワークを参照している関係でしょうか・・・

ちょっとそこまでは勉強できていませんが、うまく動作いたしませんでした・・・

上でご回答いただいている方の参考先にもAPI経由での削除方法が記載されていたのですが、そもそもVB2005からは利用できないコードらしく全滅でした・・・

一応、自分の試験中に、IEの設定を変更すればそれがWebbrowserコントロールにも反映されていることは確認できていたんですが、レジストリではその部分なんですね

どうにか消す方法がわかるとありがたいのですが・・・

2007/10/07 00:35:41
id:ardarim No.4

ardarim回答回数892ベストアンサー獲得回数1422007/10/10 00:48:55

ポイント22pt

まだオープンしてるようなので未解決なんでしょうか...

VS2005環境で確認できましたのでサンプル載せておきます。参考にしてください。

Imports System.Runtime.InteropServices
Imports Microsoft.Win32

Public Class IECache

    Private Declare Ansi Function FindFirstUrlCacheGroup Lib "wininet.dll" ( _
        ByVal dwFlags As UInt32, _
        ByVal dwFilter As UInt32, _
        ByVal lpSearchCondition As UInt32, _
        ByVal dwSearchCondition As UInt32, _
        ByRef lpGroupId As UInt64, _
        ByVal lpReserve As IntPtr) As UInt32

    Private Declare Ansi Function FindNextUrlCacheGroup Lib "wininet.dll" ( _
        ByVal hFind As UInt32, _
        ByRef lpGroupId As UInt64, _
        ByVal lpReserved As UInt32) As UInt32

    Private Declare Ansi Function DeleteUrlCacheGroup Lib "wininet.dll" ( _
        ByVal GroupId As UInt64, _
        ByVal dwFlags As UInt32, _
        ByVal lpReserved As UInt32) As UInt32

    Private Declare Ansi Function FindFirstUrlCacheEntryA Lib "wininet.dll" ( _
        <MarshalAs(UnmanagedType.LPStr), [In]()> ByVal lpszUrlSearchPattern As String, _
        ByVal lpFirstCacheEntryInfo As IntPtr, _
        ByRef lpcbCacheEntryInfo As Int32 _
    ) As IntPtr

    Private Declare Ansi Function FindNextUrlCacheEntryA Lib "wininet.dll" ( _
        ByVal hEnumHandle As UInt32, _
        ByVal lpNextCacheEntryInfo As IntPtr, _
        ByRef lpcbCacheEntryInfo As UInt32) As UInt32

    Private Declare Ansi Function DeleteUrlCacheEntry Lib "wininet.dll" Alias "DeleteUrlCacheEntryA" ( _
        <MarshalAs(UnmanagedType.LPStr), [In]()> ByVal lpszUrlName As String) As UInt32

    <StructLayout(LayoutKind.Sequential)> Private Structure INTERNET_CACHE_ENTRY_INFOA
        Public dwStructSize As Integer
        <MarshalAs(UnmanagedType.LPStr)> Public lpszSourceUrlName As String
        <MarshalAs(UnmanagedType.LPStr)> Public lpszLocalFileName As String
        Public CacheEntryType As Integer
        Public dwUseCount As Integer
        Public dwHitRate As Integer
        Public dwSizeLow As Integer
        Public dwSizeHigh As Integer
        Public LastModifiedTime As ComTypes.FILETIME
        Public ExpireTime As ComTypes.FILETIME
        Public LastAccessTime As ComTypes.FILETIME
        Public LastSyncTime As ComTypes.FILETIME
        Public lpHeaderInfo As IntPtr
        Public dwHeaderInfoSize As Integer
        <MarshalAs(UnmanagedType.LPStr)> Public lpszFileExtension As String
        Public dwExemptDelta As Integer
    End Structure

    Private Const CACHGROUP_SEARCH_ALL = &H0
    Private Const ERROR_FILE_NOT_FOUND = 2
    Private Const ERROR_NO_MORE_FILES = 18
    Private Const ERROR_NO_MORE_ITEMS = 259
    Private Const CACHEGROUP_FLAG_FLUSHURL_ONDELETE = &H2
    Private Const BUFFERSIZE = 2048

    Private Function FindFirstUrlCacheEntry(ByVal lpszUrlSearchPattern As String, ByRef lpFirstCacheEntryInfo As INTERNET_CACHE_ENTRY_INFOA, ByRef lpdwFirstCacheEntryInfoBufferSize As UInt32) As IntPtr

        Dim fceibs As Integer

        REM determine amount of memory needed
        Call FindFirstUrlCacheEntryA(Nothing, IntPtr.Zero, fceibs)
        If fceibs = 0 Then Return 0

        REM allocate memory
        Dim AllocatedSpace As IntPtr = Marshal.AllocHGlobal(fceibs)

        Dim hFile As IntPtr = FindFirstUrlCacheEntryA("*.*", AllocatedSpace, fceibs)

        REM get info
        lpFirstCacheEntryInfo = CType(Marshal.PtrToStructure(AllocatedSpace, lpFirstCacheEntryInfo.GetType), INTERNET_CACHE_ENTRY_INFOA)

        REM free memory
        Marshal.FreeHGlobal(AllocatedSpace)

        Return hFile

    End Function

    Private Function FindNextUrlCacheEntry(ByVal hEnumHandle As UInt32, ByRef lpNextCacheEntryInfo As INTERNET_CACHE_ENTRY_INFOA, ByRef lpcbCacheEntryInfo As UInt32) As IntPtr

        Dim fceibs As Integer

        REM determine amount of memory needed
        Call FindNextUrlCacheEntryA(hEnumHandle, IntPtr.Zero, fceibs)

        REM allocate memory
        Dim AllocatedSpace As IntPtr = Marshal.AllocHGlobal(fceibs)

        Dim result As UInt32 = FindNextUrlCacheEntryA(hEnumHandle, AllocatedSpace, fceibs)

        REM get info
        lpNextCacheEntryInfo = CType(Marshal.PtrToStructure(AllocatedSpace, lpNextCacheEntryInfo.GetType), INTERNET_CACHE_ENTRY_INFOA)

        REM free memory
        Marshal.FreeHGlobal(AllocatedSpace)

        Return result

    End Function

    Public Sub ClearCache()

        Dim sGroupID As UInt64
        Dim hGroup As UInt32
        Dim hFile As UInt32
        Dim sEntryInfo As INTERNET_CACHE_ENTRY_INFOA
        Dim iSize As UInt32

        On Error Resume Next

        ' Delete the groups
        hGroup = FindFirstUrlCacheGroup(0, 0, 0, 0, sGroupID, 0)

        If (hGroup <> 0) Then
            'we succeeded in finding the first cache group.. enumerate and
            'delete
            Do
                If (0 = DeleteUrlCacheGroup(sGroupID, CACHEGROUP_FLAG_FLUSHURL_ONDELETE, 0)) Then
                    ' error
                End If
                iSize = BUFFERSIZE
                If (0 = FindNextUrlCacheGroup(hGroup, sGroupID, iSize)) And (Err.LastDllError <> ERROR_FILE_NOT_FOUND) Then
                    ' error
                End If
            Loop Until Err.LastDllError = ERROR_FILE_NOT_FOUND
        End If

        ' Delete the files
        sEntryInfo.dwStructSize = 80
        iSize = BUFFERSIZE
        hFile = FindFirstUrlCacheEntry(0, sEntryInfo, iSize)
        If hFile <> 0 Then
            Do
                If (0 = DeleteUrlCacheEntry(sEntryInfo.lpszSourceUrlName)) _
                    And (Err.LastDllError <> ERROR_FILE_NOT_FOUND) Then
                    Err.Clear()
                End If
                iSize = BUFFERSIZE
                If (0 = FindNextUrlCacheEntry(hFile, sEntryInfo, iSize)) And (Err.LastDllError <> ERROR_NO_MORE_ITEMS) Then
                    'MsgBox("Error:  Unable to find the next cache entry - " & Err.LastDllError)
                    Exit Sub
                End If
            Loop Until Err.LastDllError = ERROR_NO_MORE_ITEMS
        Else
            If Err.LastDllError <> ERROR_NO_MORE_ITEMS And Err.LastDllError <> ERROR_FILE_NOT_FOUND Then
                MsgBox("ERROR: FindFirstUrlCacheEntry - " & Err.LastDllError)
            End If
        End If

    End Sub

End Class

Public Class WinINetOptions

    Private Declare Function InternetSetOption Lib "wininet.dll" Alias "InternetSetOptionA" ( _
        ByVal hInternet As UInt32, ByVal dwOption As UInt32, _
        ByVal lpBuffer As UInt32, ByVal dwBufferLength As UInt32) As UInt32

    Private Const INTERNET_OPTION_SETTINGS_CHANGED As UInt32 = 39

    Private Const WININET_REGISTRY_KEY As String = "SOFTWARE\\Microsoft\\windows\\CurrentVersion\\Internet Settings"
    Private Const WININET_REGISTRY_VALUE_SYNCMODE5 As String = "SyncMode5"

    Public Function GetSyncMode5() As UInt32

        Dim regKey As RegistryKey
        Dim regValSyncMode5 As UInt32

        regKey = Registry.CurrentUser.OpenSubKey(WININET_REGISTRY_KEY, False)
        If regKey Is Nothing Then
            regKey = Registry.CurrentUser.CreateSubKey(WININET_REGISTRY_KEY)
        End If
        If regKey Is Nothing Then Exit Function

        regValSyncMode5 = regKey.GetValue(WININET_REGISTRY_VALUE_SYNCMODE5, 4)

        regKey.Close()

        Return regValSyncMode5

    End Function

    Public Sub SetSyncMode5(ByVal newValue As UInt32)

        Dim regKey As RegistryKey

        regKey = Registry.CurrentUser.OpenSubKey(WININET_REGISTRY_KEY, True)
        If regKey Is Nothing Then
            regKey = Registry.CurrentUser.CreateSubKey(WININET_REGISTRY_KEY)
        End If
        If regKey Is Nothing Then Exit Sub

        regKey.SetValue(WININET_REGISTRY_VALUE_SYNCMODE5, newValue, RegistryValueKind.DWord)

        regKey.Close()

        Call InternetSetOption(0, INTERNET_OPTION_SETTINGS_CHANGED, 0, 0)

    End Sub

End Class

Public Class Form1

    Private Sub EnableForceUpdate(ByVal fEnable As Boolean)

        Dim inetOpt As WinINetOptions
        inetOpt = New WinINetOptions

        If fEnable Then
            inetOpt.SetSyncMode5(3)
        Else
            inetOpt.SetSyncMode5(4)
        End If

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        ' キャッシュのクリア
        Dim c As IECache = New IECache
        c.ClearCache()

        ' キャッシュを優先しない設定(毎回必ずサーバにアクセスする)
        Call EnableForceUpdate(True)

    End Sub

End Class

キャッシュがクリアされるのは動作確認しました。(C:\Documents and Settings\ユーザ名\Local Settings\Temporary Internet Files\のファイルが全削除される)

IECacheクラスとWinINetOptionsクラスはそのままコピペすれば使えると思います。

  • id:KUROX
    申し訳ありません。
    独自のtl_oleというライブラリを使って、
    キャッシュの削除を実現してるんですね。

    途中までしか見てなかったので、
    Webブラウザコントロールの機能を使ってると思ってました。

    MSDNとかみてますが、それらしい機能はないですね。
    http://msdn2.microsoft.com/ja-jp/library/3s8ys666(VS.80).aspx

    もう少し調べてみます。ごめんなさい。
  • id:KUROX
    http://www.weblio.jp/content/WebRequest.DefaultCachePolicy+%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3

    とりあえずメモ。
  • id:ardarim
    先ほどの回答が不十分だったのでコメントで追加しておきます。
    レジストリでの変更後は、アプリケーション(IE)を再起動しないと有効になりません。
    レジストリ変更を即時に有効にさせるには、
    InternetSetOption(NULL,INTERNET_OPTION_SETTINGS_CHANGED,NULL,0);
    を実行する必要があります。
    VB2005は使ったことがないので正確ではありませんが、VB6では以下のような感じです。
    Private Declare Function InternetSetOption Lib "wininet.dll" Alias "InternetSetOptionA" _
    (ByVal hinternet As Long, _
    ByVal dwoption As Long, _
    ByRef lpbuffer As Any, _
    ByVal dwbufferlength As Long) As Long
    Private Const INTERNET_OPTION_SETTINGS_CHANGED As Long = 39

    Call InternetSetOption(0, INTERNET_OPTION_SETTINGS_CHANGED, ByVal 0&, 0)
  • id:ardarim
    お役に立てなかったようですみません。
    基本的にはVB2005もVB6もあまり変わりないはずなんですが。Declareの使い方も。.Net FrameworkでもWindows APIは直接呼び出せます。
    ただ構造体とかを使ってたりすると微妙に書き方が違う場合があるのですよね。他にもLongはUInt32に置き換えるとか、いろいろ
    週明けにVB2005環境で確認してみます
    (それまでに解決できればいいですけどね)

    最終的にはレジストリを変更して、InternetSetOptionを呼び出すというのが簡単な実現方法になるかと思います。

    ちなみにこれはどうでしょう?
    Private Declare Function InternetSetOption Lib "wininet.dll" Alias "InternetSetOptionA" _
    (ByVal hinternet As UInt32, _
    ByVal dwoption As UInt32, _
    ByVal lpbuffer As UInt32, _
    ByVal dwbufferlength As UInt32) As UInt32

    Call InternetSetOption(0, 39, 0, 0)
  • id:curd
    KUROX様、ardarim様

    いつの間にか自動終了しておりました。
    大変申し訳ありませんでした。

    今回のご回答としてはardarim様の回答を解決にいたった回答とさせていただきました。
    しかし、KUROX様のご回答でお教えいただいた内容にも非常に有益なものがあったので、ardarim様に500ポイント、KUROX様に100ポイントとなるように既に付与されているポイントを差し引いたポイントをお送りしました。

    もしも届いていないようでしたご連絡ください。

    今回はご回答ありがとうございました。
  • id:KUROX
    お気遣いどうもありがとうございます。
    ありがたく頂いておきます。

    ポイントは無事届きました。
    どうもありがとうございます。
  • id:ardarim
    ポイントありがとうございました。
    とはいえ、あんまりもらいすぎてしまうと
    期待に沿った回答ができたのか不安になってしまいますね。
    当初の希望のことが実現できていれば良いのですが。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません