1、首先是使用Flags时的疑惑:INTERNET_FLAG_HYPERLINK
INTERNET_FLAG_NEED_FILE
INTERNET_FLAG_NO_CACHE_WRITE
INTERNET_FLAG_PRAGMA_NOCACHE
INTERNET_FLAG_RELOAD
INTERNET_FLAG_RESYNCHRONIZE如果我只想从Cache读取,我该使用什么标志?如果我不想从Cache读取,我是使用INTERNET_FLAG_RELOAD还是INTERNET_FLAG_PRAGMA_NOCACHE?还是同时使用?那么INTERNET_FLAG_NO_CACHE_WRITE是否应该加上呢?还有INTERNET_FLAG_HYPERLINK、INTERNET_FLAG_RESYNCHRONIZE 在决定自动更新时应该使用哪一个?INTERNET_FLAG_NEED_FILE起到什么作用?2、我在程序中使用多线程,有的线程下载网页只从Cache读取,有的需要每次读取更新网页。在使用时,刚运行时工作正常,可是运行了一段时间之后,发现后者读到的总是Cache中的内容,即无法自动更新。这到底是怎么回事?我也使用了像 INTERNET_FLAG_RELOAD 这样的标志,为什么好像不管用了呢?难道是多个线程之间相互干扰?不知大家有无这方面的经验,麻烦指点一二。

解决方案 »

  1.   

    为什么我使用了 INTERNET_FLAG_NO_CACHE_WRITE 标志依然还是被Cache了呢?另外,如果我清除了Cache中的内容,程序就会工作正常,一段时间以后又只从Cache读取了,好奇怪
      

  2.   

    一般的在使用InternetOpenURL前、先要用InternetOpenprocedure TForm1.Button1Click(Sender: TObject);
    var
      hNet,hServer: HINTERNET;
      strURL: String;
    begin
      strURL := 'http://www.yahoo.net';  { Open an internet session }
      hNet := InternetOpen('Project1', // Agent
                           INTERNET_OPEN_TYPE_PRECONFIG, // ①AccessType
                           nil, // ProxyName
                           nil, // ProxyBypass
                           0);  // or INTERNET_FLAG_ASYNC / INTERNET_FLAG_OFFLINE
      {Agent contains the name of the application or entity calling the 
       Internet functions}  { See if connection handle is valid }
      if hNet = nil then
      begin
        ShowMessage('Unable to get access to WinInet.Dll');
        Exit; 
      end;  { Connect to the Http Server }
      hServer := InternetOpenURL(hNet,         // Handle from InternetOpen
                                 PChar(strURL), // Http server
                                 nil, //header
                                 0,   //headers Length
                                 INTERNET_FLAG_RAW_DATA,// ②flag
                                 0);  // User defined number for callback
      if hServer = nil then
      begin 
        InternetCloseHandle(hNet); 
        ShowMessage(Format('Host "%s" is not available',[strURL]));
        Exit; 
      end
      else begin
        ShowMessage(Format('Host "%s" is OK',[strURL]));
      end;
      {...}
    end;対上述的説明:
    ①AccessType
    { access types for InternetOpen }
    const
      INTERNET_OPEN_TYPE_PRECONFIG        = 0;  { use registry configuration }
      {$EXTERNALSYM INTERNET_OPEN_TYPE_PRECONFIG}
      INTERNET_OPEN_TYPE_DIRECT           = 1;  { direct to net }
      {$EXTERNALSYM INTERNET_OPEN_TYPE_DIRECT}
      INTERNET_OPEN_TYPE_PROXY            = 3;  { via named proxy }
      {$EXTERNALSYM INTERNET_OPEN_TYPE_PROXY}
      INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY  = 4; { prevent using java/script/INS }
      {$EXTERNALSYM INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY}②flag
    { flags for InternetOpenUrl: }
      INTERNET_FLAG_RAW_DATA = $40000000;  { receive the item as raw data }
      {$EXTERNALSYM INTERNET_FLAG_RAW_DATA}
      INTERNET_FLAG_EXISTING_CONNECT = $20000000; { do not create new connection object }
      {$EXTERNALSYM INTERNET_FLAG_EXISTING_CONNECT}
      

  3.   

    cronuz(cronus),感谢您的答复。我现在依然疑惑的就是 如何才能不让 网页缓存到cache中,我尝试了所有的flags,似乎依然没有办法,网页依然被cache,而且第二次读取就从cahce读,我没有办法读到最新的数据。
      

  4.   

    在「InternetOpen」用「INTERNET_OPEN_TYPE_DIRECT」
    同時「InternetOpenUrl」用「INTERNET_FLAG_RAW_DATA」 也不行嗎?
      

  5.   

    cronuz(cronus),我使用了INTERNET_FLAG_RAW_DATA,对于类似 http://url/ 性质的网址不再cache,但是对于类型 http://url/page.html 类型的网页依然cache。其实是否cache倒并不是我真正关心的问题,我只想实现每次读取网页都是最新数据。
      

  6.   

    { I've written a small app that modifies a setting for IE and 
      need to somehow  tell IE to re-read the registry settings. 
      Does anyone know of an API call or message that will do this? } uses 
      WinInet; procedure IE_Reread_Registry_Settings; 
    var 
      HInet: HINTERNET; 
    begin 
      hInet := InternetOpen(PChar('YourAppName'), INTERNET_OPEN_TYPE_DIRECT, 
        nil, nil, INTERNET_FLAG_OFFLINE); 
      try 
        if hInet <> nil then 
          InternetSetOption(hInet, INTERNET_OPTION_SETTINGS_CHANGED, nil, 0); 
      finally 
        InternetCloseHandle(hInet); 
      end; 
    end; (注:給出一個「InternetSetOption」的例、強制増加「additional cache flags」
       若要「INTERNET_FLAG_NO_CACHE_WRITE」、要用到「InternetSetOption」
       我没用過、NI自己試試看...)
      

  7.   

    谢谢你。在InternetSetOption选项中,我没有找到设置CACHE读写的选项。奇怪的是,我设置了浏览器的“检查网页版本”为“每次检查”后,情况变得正常。是否可以从中得到启示?希望大家继续讨论。