翻译自 http://blog.csdn.net/CathyEagle/archive/2004/11/05/167900.aspx Private Declare Function GetUrlCacheEntryInfo Lib "wininet.dll" Alias _ "GetUrlCacheEntryInfoW" (ByVal lpszUrlName As Long, ByVal lpCacheEntryInfo As _ Long, ByRef lpdwCacheEntryInfoBufferSize As Long) As Long 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