最近学习如何清理IE缓存,删除IE临时文件 在网上看到如下代码,摘录:FindFirstUrlCacheEntry(nil, TInternetCacheEntryInfo(nil^), dwEntrySize);
文章来源于《傻猫网络日志》 http://www.samool.com/category/Delphi/17/TInternetCacheEntryInfo(nil^) 这个nil是指针吗?椐我所知,只有指针才可以使用^运算符。但是 nil 好像不是指针啊。

解决方案 »

  1.   


    既然是空指针 内存地址就是00000000 ,对不对。nil^ 它的返回值是什么啊??
      

  2.   

    可能是那个函数需要一个值,函数会根据值的地址进行判断
    传 nil^,函数判断的地址就是nil了
      

  3.   

    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;
      

  4.   

    nil是nil,地址是地址,分清楚
      

  5.   

    hongqi162 回答得很详解。个人理解,这里的p就是二级指针。任何未初始化的变量或指针默认值都是nil空指针。
    而p就是指向nil空指针的指针。对不对????????????var
      p: PInternetCacheEntryInfoA;
    begin
      dwEntrySize := 0;
    // FindFirstUrlCacheEntry(nil, TInternetCacheEntryInfo(nil^), dwEntrySize);FindFirstUrlCacheEntry(nil, p^, dwEntrySize);
      

  6.   

    那写法感觉就是脱裤子放屁
    就是个nilFindFirstUrlCacheEntry 用两次,第一次主要用来取大小,
    然后GetMem() 给 INTERNET_CACHE_ENTRY_INFOA *类型的指针分配循环第一次取得的大小
    然后一循环就完了 
      

  7.   

    这个是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)^);这样就不用去定义个变量来专门为了这个无用的参数作参数用了
      

  8.   

    恩, 刚刚去看了下DELPHI的定义
    function FindFirstUrlCacheEntry(lpszUrlSearchPattern: PAnsiChar;
      var lpFirstCacheEntryInfo: TInternetCacheEntryInfo;
      var lpdwFirstCacheEntryInfoBufferSize: DWORD): THandle; stdcall;确实个var引用类型, 这样主要是为了节省定义一个变量HANDLE FindFirstUrlCacheEntry(
      LPCTSTR lpszUrlSearchPattern,
      LPINTERNET_CACHE_ENTRY_INFO lpFirstCacheEntryInfo,
      LPDWORD lpdwFirstCacheEntryInfoBufferSize
    );
      

  9.   

    参数定义类型为var而不是直接的指针类型