pFile->QueryInfo(HTTP_QUERY_LAST_MODIFIED, &stUTC) 多次调用出错

himaernew 2004-11-21 10:52:34
我想取远程文件的最后修改日期,重复的调用后就取不到了,但其它的取文件长度等信息还能取到。
对于"HTTP_QUERY_LAST_MODIFIED"的参数有什么特殊的限制吗?
我想这不是很难的问题,但我调了2天了还是没搞清原因。
...全文
480 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
celerityok 2004-11-25
  • 打赏
  • 举报
回复
mark!
Hendy_So 2004-11-24
  • 打赏
  • 举报
回复
在error lookup里的modules里面添加wininet.dll就可以查到winet库里的出错消息了。
himaernew 2004-11-24
  • 打赏
  • 举报
回复
多谢两位!
TO: Hendy_So
我的error lookup查不到12150的错误信息。

这个问题我找到出错地方并已解决了。出错的代码不是在QueryInfo这个函数,而是在HTTP请求句柄处:
CHttpFile *pFile =pConnection->OpenRequest(CHttpConnection::HTTP_VERB_GET,buf,
NULL, 1, NULL, NULL,HSR_DOWNLOAD| INTERNET_FLAG_EXISTING_CONNECT | INTERNET_FLAG_NO_AUTO_REDIRECT);
上面的代码在取第2个文件的最后修改时间时会出错。

正确的代码:
CHttpFile *pFile =pConnection->OpenRequest(CHttpConnection::HTTP_VERB_GET,buf,
NULL, 1, NULL, NULL, INTERNET_FLAG_EXISTING_CONNECT|INTERNET_FLAG_RELOAD);

问题就出在传入这个dwFlags上,如单独用"INTERNET_FLAG_EXISTING_CONNECT"也是会出错。
我想出现这个问题还是循环打开文件时, cache没清空的问题,用"INTERNET_FLAG_RELOAD"将不从cache中取值。

看来我需要好好理解一下dwFlags的各个值的真正含义。

光这个问题花了我3~4天,现在也到早晨了。我想这个贴了再留一天,也许还有其它人碰到过相同的问题或有更好的解释,明天结贴。
himaernew 2004-11-24
  • 打赏
  • 举报
回复
TO HENDY_SO:
TKS. 可以查找到错误信息了。
himaernew 2004-11-23
  • 打赏
  • 举报
回复
首先多谢你的耐心。
是这样的,我想做一个自动更新程序,所以需要从网上循环取文件并比较最后修改时间,来确定需更新文件。在调试过程中我发现有些文件可以取到正确的最后修改时间,但有些却不能。
你给我的那篇文章我看过了, 它的情况是只处理一个文件,和我的稍有不同。而且它没有取“最后修改时间”出错的预防和更正,呵,它在取不到时间后只是返回了“xx:x:xx”。
刚开始我也怀疑是缓冲区没清空的问题,但QueryInfo取时间值时是不用处理缓冲区的。
至于上面我做的循环,只是做测试的,我是想要测试一下QueryInfo取SYSTEMTIME的过程中出错的规律。
再次表示感谢,这个问题已困扰我几天了。
kingzai 2004-11-23
  • 打赏
  • 举报
回复
你为什么要循环取呢?MSDN上我还没有找到多次调用会出错的KB,找到一篇它的用法,你可以看看。
http://www.funducode.com/weeklyupdate/March_31/March_31.htm
Article: Using HTTP

Hendy_So 2004-11-23
  • 打赏
  • 举报
回复
12150 未找到申请的邮件标头,vc自带的error lookup可以查错误信息。

不知道你怎么做的,我通常不用MFC的类,而用wininet api。对于不同的远程文件,应该有不同的request对应吧,针对不同的request handle调用queryinfo应该没有问题。
kingzai 2004-11-23
  • 打赏
  • 举报
回复

12150 ERROR_HTTP_HEADER_NOT_FOUND
The requested header could not be located.
我查到的错误是这个,你找个http sniffer对比一下两次的请求包是否一样,对这种怪问题,也只有如此来找问题了。
himaernew 2004-11-23
  • 打赏
  • 举报
回复
执行QueryInfo后用GetLastError()得到的错误码是12150,12150在winerror.h中是没定义的。
himaernew 2004-11-23
  • 打赏
  • 举报
回复
WEB SERVER是WIN2K 自带的IIS
himaernew 2004-11-23
  • 打赏
  • 举报
回复
TO KINGZAI:
TKS, 你说的正确,自动升级按我这样做是不太准确的,但一般能接受。
如果写的ini文件中有修改时间则需要每次更新服务器端都要处理一次这个ini文件(如写入文件的修改时间), 会比较烦。而我这样做则这个ini文件只需要在建立时处理一次就可以了。
我做测试时发现每次重启PC后,第一次总能取到值,但第二次就取不到了,我怀疑虽然QueryInfo(或HttpQueryInfo)取值时没申请但内部还是有缓冲区的设置,取完后没清空。
我测试时用的是VS.NET 2003(没打补丁) + WIN2K 2004 SP4.
kingzai 2004-11-23
  • 打赏
  • 举报
回复
自动升级一般不会读WEB文件的最后修改时间,这样不太准确。你写个ini或文本文件,把最后修改时间写在其中,读取内容之后做比较,这样会比较准确一些。
himaernew 2004-11-22
  • 打赏
  • 举报
回复
TO KINGZAI:
TKS。
我先不用MFC试试,我猜是MFC处理上有问题。
“重新清缓冲区”? 我每次调用都是要初始化“stUTC”的。
kingzai 2004-11-22
  • 打赏
  • 举报
回复
我的理解是每次查询之后重新清缓冲区
himaernew 2004-11-22
  • 打赏
  • 举报
回复
TO:kingzai:
我看以前的贴了,说过把dwquerybuflen设置成一个较大的值就可以,但我还是有几处不明白。
较大是多大?是不是大于sizeof(SYSTEMTIME)的值吗?直接采用MFC是不用该参数的。是不是不能用MFC的这个现成的函数。
kingzai 2004-11-22
  • 打赏
  • 举报
回复
每次查询以后,要把dwquerybuflen设置成一个较大的值就可以。
himaernew 2004-11-22
  • 打赏
  • 举报
回复
用GetLastError()得到的是12150,查不到对应的错误信息。
还有就是我感觉好象不太稳定,有时可取到正确的值,有时不行。
我是这样测试的:连续2次循环取2个文件的最后修改日期,第一次循环时,第1个文件文件2次循环都可正确的取到,第2个文件第1次循环可到正确的值但第2次循环就取不到正确的值了。

但我下午再测试时又变了:第1个文件2次循环都可取到正确的值,但第2个文件第1次循环取不到正确的值了(但第2次循环又可取到正确的值了)

谁知道到底是什么原因呀?我在线等。
himaernew 2004-11-22
  • 打赏
  • 举报
回复
还是不可以,真的不知道要怎么处理了。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧