翻译自 http://blog.csdn.net/CathyEagle/archive/2004/11/05/167900.aspx
Private Const ERROR_INSUFFICIENT_BUFFER As Long = 122
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByVal Destination As Long, ByVal Source As Long, ByVal Length As Long)
Private Declare Function SysAllocString Lib "oleaut32.dll" (ByVal pOlechar As Long) As String
Private Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type
Private Type INTERNET_CACHE_ENTRY_INFO
dwStructSize As Long
lpszSourceUrlName As Long
lpszLocalFileName As Long
CacheEntryType As Long
dwUseCount As Long
dwHitRate As Long
dwSizeLow As Long
dwSizeHigh As Long
LastModifiedTime As FILETIME
ExpireTime As FILETIME
LastAccessTime As FILETIME
LastSyncTime As FILETIME
lpHeaderInfo As Long
dwHeaderInfoSize As Long
lpszFileExtension As Long
'union {
' DWORD dwReserved;
' DWORD dwExemptDelta;
'}
dwReserved As Long
End Type
Private Function GetPathFromUrl(lpszUrl$) As String
Dim dwEntrySize&
Dim lpCacheEntry As INTERNET_CACHE_ENTRY_INFO
Dim lpCacheEntryByte() As Byte
Dim strTemp(80) As Byte
Dim dwTemp&
'假设lpszUrl是图片的url
Call GetUrlCacheEntryInfo(StrPtr(lpszUrl), 0, dwEntrySize)
If Err.LastDllError = ERROR_INSUFFICIENT_BUFFER Then
ReDim lpCacheEntryByte(dwEntrySize)
Debug.Print dwEntrySize
'lpCacheEntry = (LPINTERNET_CACHE_ENTRY_INFO)new char[dwEntrySize];
Else
Exit Function
End If
Err.Clear
Call GetUrlCacheEntryInfo(StrPtr(lpszUrl), VarPtr(lpCacheEntryByte(0)), dwEntrySize)
Debug.Print Err.LastDllError
'If Err.LastDllError = 0 Then
'//lpCacheEntry->lpszLocalFileName即是lpszUrl在缓存中的文件名
'return TRUE;
CopyMemory VarPtr(lpCacheEntry), VarPtr(lpCacheEntryByte(0)), Len(lpCacheEntry)
GetPathFromUrl = StrConv(SysAllocString(lpCacheEntry.lpszLocalFileName), vbFromUnicode)
'End If
End Function