最近学习如何清理IE缓存,删除IE临时文件 在网上看到如下代码,摘录:FindFirstUrlCacheEntry(nil, TInternetCacheEntryInfo(nil^), dwEntrySize);
文章来源于《傻猫网络日志》 http://www.samool.com/category/Delphi/17/TInternetCacheEntryInfo(nil^) 这个nil是指针吗?椐我所知,只有指针才可以使用^运算符。但是 nil 好像不是指针啊。
文章来源于《傻猫网络日志》 http://www.samool.com/category/Delphi/17/TInternetCacheEntryInfo(nil^) 这个nil是指针吗?椐我所知,只有指针才可以使用^运算符。但是 nil 好像不是指针啊。
既然是空指针 内存地址就是00000000 ,对不对。nil^ 它的返回值是什么啊??
传 nil^,函数判断的地址就是nil了
VC函数声明:
HANDLE FindFirstUrlCacheEntry(
LPCTSTR lpszUrlSearchPattern,
LPINTERNET_CACHE_ENTRY_INFO lpFirstCacheEntryInfo,
LPDWORD lpdwFirstCacheEntryInfoBufferSize);
函数功能:从Internet的高速缓存中找到特定入口
参数说明:
LPCTSTR lpszUrlSearchPattern,入口特征字段,比如cook:或者visited: 如果该参数没有指定则为*.*
lpFirstCacheEntryInfo INTERNET_CACHE_ENTRY_INFO的结构体指针 注:这个结构体就是包含缓存信息的结构体 特别介绍一下
typedef struct _INTERNET_CACHE_ENTRY_INFO {
DWORD dwStructSize;//结构体大小,常用来帮助决定使用Internet缓存使用的版本
LPTSTR lpszSourceUrlName;//Internet URL地址名 它处在结构体内存分配的最末端
LPTSTR lpszLocalFileName;//Internet缓存的本地文件名
DWORD CacheEntryType;//缓存入口类型 EDITED_CACHE_ENTRY表示缓存入口从网络上下载后已经改变 NORMAL_CACHE_ENTRY表示可以删除释放空间 SPARSE_CACHE_ENTRY表示当前还没有使用的入口 STICKY_CACHE_ENTRY粘贴缓存入口
DWORD dwUseCount;//当前用户使用缓存的次数
DWORD dwHitRate;
DWORD dwSizeLow;//文件大小的低位
DWORD dwSizeHigh;//文件大小的高位
FILETIME LastModifiedTime;//最后一次修改的时间
FILETIME ExpireTime;//入口到期时间
FILETIME LastAccessTime;//最后一次访问的时间
FILETIME LastSyncTime;//最后一次与服务器同步的时间
LPBYTE lpHeaderInfo;//Internet缓存信息头的地址
DWORD dwHeaderInfoSize;//Internet缓存信息头的信息大小
LPTSTR lpszFileExtension;//文件扩展(相当于将信息文件备份)
union {
DWORD dwReserved;//用于保留 必须为0
DWORD dwExemptDelta;豁免时间,跟最后访问时间有关(笔者不太明白)
};
lpdwFirstCacheEntryInfoBufferSize 表示用于保存信息的结构体的缓存大小]
返回值:
如果成功将返回Internet Cache句柄 失败为NULL
备注
这个函数和FindNextUrlCacheEntry函数都返回的是一个大小可变的数据,如果返回的是ERROR_INSUFFICIENT_BUFFER 则应该分配lpdwFirstCacheEntryInfoBufferSize大小的内存空间来保存
你也可以这样使用
var
p: PInternetCacheEntryInfoA;
begin
dwEntrySize := 0;
// FindFirstUrlCacheEntry(nil, TInternetCacheEntryInfo(nil^), dwEntrySize);
new(p);
FindFirstUrlCacheEntry(nil, p^, dwEntrySize);
dispose(p);
....
end;
而p就是指向nil空指针的指针。对不对????????????var
p: PInternetCacheEntryInfoA;
begin
dwEntrySize := 0;
// FindFirstUrlCacheEntry(nil, TInternetCacheEntryInfo(nil^), dwEntrySize);FindFirstUrlCacheEntry(nil, p^, dwEntrySize);
就是个nilFindFirstUrlCacheEntry 用两次,第一次主要用来取大小,
然后GetMem() 给 INTERNET_CACHE_ENTRY_INFOA *类型的指针分配循环第一次取得的大小
然后一循环就完了
Delphi一般把必须要传值的指针定义为 var xxx : 类型
如:
procedure InitializeCriticalSection(var lpCriticalSection: TRTLCriticalSection); stdcall;
如果定义为:
procedure InitializeCriticalSection(lpCriticalSection: PRTLCriticalSection); stdcall;
起效果和编译后的代码和上面一样。
但是用户可以传递一个空指针(NIL)作参数,编译会通过,但是运行会报错,把错误尽量体现在编译阶段是一个很大的进步。对于可以传递 空指针的情况, Delphi才定义为指针类型,这个时候传递NIL,其他参数得当,不会出错,函数体内多半会判断这个指针是否为空
如:
ReadFile 函数的最后一个参数lpOverlapped: POverlapped还有一种情况,就是混合类型指针, Send(s : TStock; var Buf;..)的 Buf有时候在确保传递NIL也不会出错的情况下,要使用 var 定义的参数,就可以使用 NIL^了
如Send(Stock , NIL^ , 0 , 0);
CreateThread(NIL , 0 , @Proc , NIL , 0 , DWORD(NIL^));
或者
CreateThread(NIL , 0 , @Test , NIL , 0 , PDWORD(NIL)^);这样就不用去定义个变量来专门为了这个无用的参数作参数用了
function FindFirstUrlCacheEntry(lpszUrlSearchPattern: PAnsiChar;
var lpFirstCacheEntryInfo: TInternetCacheEntryInfo;
var lpdwFirstCacheEntryInfoBufferSize: DWORD): THandle; stdcall;确实个var引用类型, 这样主要是为了节省定义一个变量HANDLE FindFirstUrlCacheEntry(
LPCTSTR lpszUrlSearchPattern,
LPINTERNET_CACHE_ENTRY_INFO lpFirstCacheEntryInfo,
LPDWORD lpdwFirstCacheEntryInfoBufferSize
);