• Thứ Ba, 16/01/2007 13:56 (GMT+7)

    Lấy đường dẫn của 1 file (HTML hoặc hình ảnh) đã có trong IE cache (Temporary Internet Files) với thông số đầu vào là URL

    Câu hỏi :
    Tôi muốn viết chương trình VB6 lấy đường dẫn của 1 file (HTML hoặc hình ảnh) đã có trong IE cache (Temporary Internet Files) với thông số đầu vào là URL, bằng cách sử dụng hàm GetUrlCacheEntryInfo trong thư viện WININET.DLL. Xin tạp chí cho một ví dụ cụ thể về hàm này ứng dụng trong trường hợp trên. 
     

    Trả lời :

    Hàm GetUrlCacheEntryInfo() chỉ cho phép tìm record thông tin chi tiết về 1 phần tử cụ thể trong IE Cache nếu bạn biết chính xác URL của phần tử đó. Trong trường hợp chưa biết rõ các phần tử hiện có trong IE Cache, bạn nên dùng 2 hàm API tên là FindFirstUrlCacheEntry() và FindNextUrlCacheEntry() để duyệt từng phần tử được chứa trong IE Cache. Khi gặp từng phần tử, bạn kiểm tra các thông tin cần thiết để xử lý theo yêu cầu riêng của mình. Sau đây là qui trình xây dựng ứng dụng VB 6.0 đơn giản cho phép hiển thị 2 thuộc tính cơ bản là URL và LocalFile của tất cả các phần tử được chứa trong IE Cache của máy:

     - Chạy VB 6.0, tạo Project "Standard Exe".
     - Khi form trống của chương trình hiển thị, hãy vẽ 1 ListBox với tên mặc định là ListBox1 lên hết Form giao diện.
     - Chọn menu View.Code để hiển thị cửa sổ soạn code cho Form rồi viết đoạn code VB sau đây:
     Option Explicit
     'khai báo các hằng cần dùng
     Private Const CACHGROUP_SEARCH_ALL = &H0
     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
     
     'khai báo kiểu record chứa kết quả
     Private Type INTERNET_CACHE_ENTRY_INFO
     dwStructSize As Long
     pURL As Long
     pLocalName As Long
     szRestOfData(1022) As Long
     End Type
     
     'khai báo các hàm cần dùng
     Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
     (Destination As Any, Source As Any, ByVal Length As Long)
     Private Declare Function FindFirstUrlCacheEntry Lib "wininet.dll" Alias "FindFirstUrlCacheEntryA" ( _
     ByVal lpszUrlSearchPattern As String, _
     ByRef lpFirstCacheEntryInfo As INTERNET_CACHE_ENTRY_INFO, _
     ByRef lpdwFirstCacheEntryInfoBufferSize As Long) As Long
     Private Declare Function FindNextUrlCacheEntry Lib "wininet.dll" Alias "FindNextUrlCacheEntryA" ( _
     ByVal hEnumHandle As Long, _
     ByRef lpNextCacheEntryInfo As INTERNET_CACHE_ENTRY_INFO, _
     ByRef lpdwNextCacheEntryInfoBufferSize As Long) As Long
     
     'định nghĩa hàm Form_Load()
     Private Sub Form_Load()
     'khai báo các biến cần dùng
     Dim hFile As Long
     Dim sEntryInfo As INTERNET_CACHE_ENTRY_INFO
     Dim iSize As Long
     Dim strURL As String
     Dim buf(512) As Byte
     Dim vNames As Variant
     On Error Resume Next
     'Tìm thông tin về phần tử đầu tiên
     sEntryInfo.dwStructSize = 80
     iSize = BUFFERSIZE
     hFile = FindFirstUrlCacheEntry(0, sEntryInfo, iSize)
     If (hFile = 0) Then
     If (Err.LastDllError = ERROR_NO_MORE_ITEMS) Then
     GoTo done
     End If
     MsgBox "ERROR: FindFirstUrlCacheEntry - " & Err.LastDllError
     Exit Sub
     End If
     'Lặp hiển thị thông tin từng phần tử lên ListBox
     Do
     'nếu có URL thì hiển thị
     If sEntryInfo.pURL <> 0 Then
     Call CopyMemory(buf(0), ByVal sEntryInfo.pURL, 512)
     strURL = StrConv(buf, vbUnicode)
     vNames = Split(strURL, vbNullChar)
     List1.AddItem "URL : " & vNames(0)
     End If
     'nếu có LocalFile thì hiển thị
     If sEntryInfo.pLocalName <> 0 Then
     Call CopyMemory(buf(0), ByVal sEntryInfo.pLocalName, 512)
     strURL = StrConv(buf, vbUnicode)
     vNames = Split(strURL, vbNullChar)
     List1.AddItem "LN : " & vNames(0)
     End If
     'Tìm thông tin về phần tử kế
     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
     done:
     End Sub
     

    Chuyên mục: Lập trình