人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

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

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

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

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

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

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

よろしくお願いします。

●質問者: curd
●カテゴリ:インターネット ウェブ制作
✍キーワード:API エラー オフ キャッシュ コントロール
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● KUROX
●23ポイント

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

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

◎質問者からの返答

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

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

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

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


2 ● ardarim
●23ポイント

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

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 に置き換えればそのまま使えるかと思います。

◎質問者からの返答

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

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

私が今困っているのは、

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

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

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

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


3 ● ardarim
●22ポイント

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


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

アプリケーションが 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: 自動的に確認する(デフォルト)
◎質問者からの返答

なるほど。。。

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

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

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

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

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

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

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

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


4 ● ardarim
●22ポイント

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

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クラスはそのままコピペすれば使えると思います。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ