这段据说是书上的原码,第一次执行它时,没有什么错误,但连续第二次执行时,它就会死循环了。我看不懂这段代码,我估计是已经全清空了,所以目标为空,而只遇到
dwLastError = ERROR_NO_MORE_ITEMS时退出,好像错误信息不准确吧?谁能帮帮我呢
procedure DelHistory;
var
  lpEntryInfo: PInternetCacheEntryInfo;
  hCacheDir: LongWord ;
  dwEntrySize, dwLastError: LongWord;
begin
   dwEntrySize := 0;
   FindFirstUrlCacheEntry(nil, TInternetCacheEntryInfo(nil^), dwEntrySize);
   GetMem(lpEntryInfo, dwEntrySize);   hCacheDir := FindFirstUrlCacheEntry(nil, lpEntryInfo^, dwEntrySize);
   if hCacheDir <> 0 then
      DeleteUrlCacheEntry(lpEntryInfo^.lpszSourceUrlName);
   FreeMem(lpEntryInfo);   repeat
     dwEntrySize := 0;
     FindNextUrlCacheEntry(hCacheDir, TInternetCacheEntryInfo(nil^),
       dwEntrySize);
     dwLastError := GetLastError();
     if dwLastError = ERROR_INSUFFICIENT_BUFFER then //如果成功
     begin
         GetMem(lpEntryInfo, dwEntrySize); {分配dwEntrySize字节的内存}
         if FindNextUrlCacheEntry(hCacheDir, lpEntryInfo^, dwEntrySize) then
            DeleteUrlCacheEntry(lpEntryInfo^.lpszSourceUrlName);
         FreeMem(lpEntryInfo);
     end;
  until (dwLastError = ERROR_NO_MORE_ITEMS);
end;

解决方案 »

  1.   

    FindFirstUrlCacheEntry(nil, TInternetCacheEntryInfo(nil^), dwEntrySize);
       GetMem(lpEntryInfo, dwEntrySize);
    如果第一次为空,
    GetMem还有必要吗?
    是不是这里要判断一下,
    if FindFirstUrlCacheEntry(nil, TInternetCacheEntryInfo(nil^), dwEntrySize)=dwLastError then
      exit;     
      

  2.   

    //利用OLD对象~~
    uses ComObj;procedure ClearIEHistory;
    const
      CLSID_CURLHISTORY: TGUID = '{3C374A40-BAE4-11CF-BF7D-00AA006946EE}';
    var
      IEHistory: OleVariant;
    begin
      IEHistory := CreateComObject(CLSID_CURLHISTORY);
      IEHistory.ClearHistory;
      IEHistory := NULL;
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      ClearIEHistory
    end;
      

  3.   

    xiangding(生下来就没明白:人活着的意义.....) 
    你的方法不行。也无法正确做出如果目标为空的处理。zswangII(伴水清清)(一贴不灌,何以灌天下?) 
    你的方法我好像见过,不过IEHistory.ClearHistory;这句编译不过去。
      

  4.   

    UP  UPhttp://www.kan68.com/index3.htm?user=zhttz
      

  5.   

    把until (dwLastError = ERROR_NO_MORE_ITEMS);改成   until  (dwLastError = ERROR_NO_MORE_ITEMS)or(dwLastError = ERROR_NO_MORE_FILES)
       or (dwLastError = ERROR_INVALID_PARAMETER)
    就可以了。你的条件表达式少写了一些,造成了死循环