pFile->QueryInfo(HTTP_QUERY_LAST_MODIFIED, &stUTC) 多次调用出错 我想取远程文件的最后修改日期,重复的调用后就取不到了,但其它的取文件长度等信息还能取到。对于"HTTP_QUERY_LAST_MODIFIED"的参数有什么特殊的限制吗?我想这不是很难的问题,但我调了2天了还是没搞清原因。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 每次查询以后,要把dwquerybuflen设置成一个较大的值就可以。 TO:kingzai:我看以前的贴了,说过把dwquerybuflen设置成一个较大的值就可以,但我还是有几处不明白。较大是多大?是不是大于sizeof(SYSTEMTIME)的值吗?直接采用MFC是不用该参数的。是不是不能用MFC的这个现成的函数。 TO KINGZAI:TKS。我先不用MFC试试,我猜是MFC处理上有问题。“重新清缓冲区”? 我每次调用都是要初始化“stUTC”的。 用GetLastError()得到的是12150,查不到对应的错误信息。还有就是我感觉好象不太稳定,有时可取到正确的值,有时不行。我是这样测试的:连续2次循环取2个文件的最后修改日期,第一次循环时,第1个文件文件2次循环都可正确的取到,第2个文件第1次循环可到正确的值但第2次循环就取不到正确的值了。但我下午再测试时又变了:第1个文件2次循环都可取到正确的值,但第2个文件第1次循环取不到正确的值了(但第2次循环又可取到正确的值了)谁知道到底是什么原因呀?我在线等。 你为什么要循环取呢?MSDN上我还没有找到多次调用会出错的KB,找到一篇它的用法,你可以看看。http://www.funducode.com/weeklyupdate/March_31/March_31.htmArticle: Using HTTP 首先多谢你的耐心。 是这样的,我想做一个自动更新程序,所以需要从网上循环取文件并比较最后修改时间,来确定需更新文件。在调试过程中我发现有些文件可以取到正确的最后修改时间,但有些却不能。 你给我的那篇文章我看过了, 它的情况是只处理一个文件,和我的稍有不同。而且它没有取“最后修改时间”出错的预防和更正,呵,它在取不到时间后只是返回了“xx:x:xx”。 刚开始我也怀疑是缓冲区没清空的问题,但QueryInfo取时间值时是不用处理缓冲区的。 至于上面我做的循环,只是做测试的,我是想要测试一下QueryInfo取SYSTEMTIME的过程中出错的规律。 再次表示感谢,这个问题已困扰我几天了。 自动升级一般不会读WEB文件的最后修改时间,这样不太准确。你写个ini或文本文件,把最后修改时间写在其中,读取内容之后做比较,这样会比较准确一些。 TO KINGZAI: TKS, 你说的正确,自动升级按我这样做是不太准确的,但一般能接受。 如果写的ini文件中有修改时间则需要每次更新服务器端都要处理一次这个ini文件(如写入文件的修改时间), 会比较烦。而我这样做则这个ini文件只需要在建立时处理一次就可以了。 我做测试时发现每次重启PC后,第一次总能取到值,但第二次就取不到了,我怀疑虽然QueryInfo(或HttpQueryInfo)取值时没申请但内部还是有缓冲区的设置,取完后没清空。 我测试时用的是VS.NET 2003(没打补丁) + WIN2K 2004 SP4. WEB SERVER是WIN2K 自带的IIS 执行QueryInfo后用GetLastError()得到的错误码是12150,12150在winerror.h中是没定义的。 12150 ERROR_HTTP_HEADER_NOT_FOUND The requested header could not be located.我查到的错误是这个,你找个http sniffer对比一下两次的请求包是否一样,对这种怪问题,也只有如此来找问题了。 12150 未找到申请的邮件标头,vc自带的error lookup可以查错误信息。不知道你怎么做的,我通常不用MFC的类,而用wininet api。对于不同的远程文件,应该有不同的request对应吧,针对不同的request handle调用queryinfo应该没有问题。 多谢两位! 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天,现在也到早晨了。我想这个贴了再留一天,也许还有其它人碰到过相同的问题或有更好的解释,明天结贴。 在error lookup里的modules里面添加wininet.dll就可以查到winet库里的出错消息了。 TO HENDY_SO: TKS. 可以查找到错误信息了。 请问对话框改变大小后的问题 VC2008有FeaturePack,VC2010有么? 这是个界面库! 界面类似仪表? 神经病?复读机? 用bitblt加载的图像,有没有一个函数把它卸载下来呢 女程序员们的故事 关于类定义的问题,请大侠们帮忙 请问如何获得在网页中输入的密码? Socket的多端口数据采集? 为什么网站上的资源下载不了啊 请问GDI+中如何使用new来进行对象构造? 谁能介绍一个有关扫描仪的DLL和驱动方面的文档或程序
我看以前的贴了,说过把dwquerybuflen设置成一个较大的值就可以,但我还是有几处不明白。
较大是多大?是不是大于sizeof(SYSTEMTIME)的值吗?直接采用MFC是不用该参数的。是不是不能用MFC的这个现成的函数。
TKS。
我先不用MFC试试,我猜是MFC处理上有问题。
“重新清缓冲区”? 我每次调用都是要初始化“stUTC”的。
还有就是我感觉好象不太稳定,有时可取到正确的值,有时不行。
我是这样测试的:连续2次循环取2个文件的最后修改日期,第一次循环时,第1个文件文件2次循环都可正确的取到,第2个文件第1次循环可到正确的值但第2次循环就取不到正确的值了。但我下午再测试时又变了:第1个文件2次循环都可取到正确的值,但第2个文件第1次循环取不到正确的值了(但第2次循环又可取到正确的值了)谁知道到底是什么原因呀?我在线等。
http://www.funducode.com/weeklyupdate/March_31/March_31.htm
Article: Using HTTP
是这样的,我想做一个自动更新程序,所以需要从网上循环取文件并比较最后修改时间,来确定需更新文件。在调试过程中我发现有些文件可以取到正确的最后修改时间,但有些却不能。
你给我的那篇文章我看过了, 它的情况是只处理一个文件,和我的稍有不同。而且它没有取“最后修改时间”出错的预防和更正,呵,它在取不到时间后只是返回了“xx:x:xx”。
刚开始我也怀疑是缓冲区没清空的问题,但QueryInfo取时间值时是不用处理缓冲区的。
至于上面我做的循环,只是做测试的,我是想要测试一下QueryInfo取SYSTEMTIME的过程中出错的规律。
再次表示感谢,这个问题已困扰我几天了。
TKS, 你说的正确,自动升级按我这样做是不太准确的,但一般能接受。
如果写的ini文件中有修改时间则需要每次更新服务器端都要处理一次这个ini文件(如写入文件的修改时间), 会比较烦。而我这样做则这个ini文件只需要在建立时处理一次就可以了。
我做测试时发现每次重启PC后,第一次总能取到值,但第二次就取不到了,我怀疑虽然QueryInfo(或HttpQueryInfo)取值时没申请但内部还是有缓冲区的设置,取完后没清空。
我测试时用的是VS.NET 2003(没打补丁) + WIN2K 2004 SP4.
12150 ERROR_HTTP_HEADER_NOT_FOUND
The requested header could not be located.
我查到的错误是这个,你找个http sniffer对比一下两次的请求包是否一样,对这种怪问题,也只有如此来找问题了。
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天,现在也到早晨了。我想这个贴了再留一天,也许还有其它人碰到过相同的问题或有更好的解释,明天结贴。
TKS. 可以查找到错误信息了。