读书人

TInternetCacheEntryInfo(nil^) 这个n

发布时间: 2012-03-15 11:50:38 作者: rapoo

TInternetCacheEntryInfo(nil^) 这个nil^是什么意思?
最近学习如何清理IE缓存,删除IE临时文件 在网上看到如下代码,摘录:

FindFirstUrlCacheEntry(nil, TInternetCacheEntryInfo(nil^), dwEntrySize);
文章来源于《傻猫网络日志》 http://www.samool.com/category/Delphi/17/

TInternetCacheEntryInfo(nil^) 这个nil是指针吗?椐我所知,只有指针才可以使用^运算符。但是 nil 好像不是指针啊。

[解决办法]
nil是空指针
[解决办法]
可能是那个函数需要一个值,函数会根据值的地址进行判断
传 nil^,函数判断的地址就是nil了
[解决办法]
FindFirstUrlCacheEntry
  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;
[解决办法]
这个是Delphi定义的一个方便的和排除错误使用的方法(不知道其他语言是否这样)
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)^);

这样就不用去定义个变量来专门为了这个无用的参数作参数用了

读书人网 >.NET

热点推荐