我们产品中的互联网访问代码适用于99.99%的人。然而,对于其中一些,它根本不起作用。我们一直在添加一些跟踪代码来尝试找出问题所在,并且事实证明InternetOpenURL报告错误2 - “系统无法找到指定的文件” - 来自此函数调用:
options = INTERNET_FLAG_RAW_DATA | INTERNET_FLAG_RESYNCHRONIZE;
handle = InternetOpenUrl(internet,url,NULL,0,options,0);
(互联网是使用InternetOpen打开的互联网连接的句柄,url是我们的网络服务器上存在的简单文本文件的URL。)
我们测试两个不同的网站,一个http和一个https,它们位于完全不同的地方(不同的域,地理位置分开的服务器),它们都为这个人和其他几个人提供了同样的错误。 99%的人,包括我们自己,都可以毫无问题地访问它们。不仅如此,受影响的人可以在他们的网络浏览器中访问相同的URL而没有问题。
这到底是怎么回事? :(
编辑:幸运的是,我们发现了什么问题!事实证明,有些人在其互联网选项中选中了“为您的LAN使用代理服务器”复选框,而没有实际指定代理服务器。我们试图使用不存在的代理服务器细节,当然也遇到了问题。
我仍然需要为此调查程序化解决方案,但报告问题的每个人都通过此解决方案解决了问题:
我不知道为什么有这么多人检查了这个盒子但没有指定代理服务器。但显然这是需要做的事情来解决它。
答案 0 :(得分:2)
GetLastError()
可能不是找出问题的最佳方法。来自docs:
要确定拒绝访问服务的原因,请致电InternetGetLastResponseInfo。
答案 1 :(得分:2)
鉴于这些信息,我猜这些用户会有一个防火墙(或某种类型的安全软件)挂钩wininet并干扰你的通话。或者,他们可能有恶意软件侵扰。
答案 2 :(得分:2)
解决方案可能就像打开Internet Explorer一样简单。我从不使用浏览器,但是Windows更新破坏了对InternetOpenUrl的调用。
打开IE将设置选项,以便读取代理信息再次起作用。请注意,在InternetOpen()中使用INTERNET_OPEN_TYPE_PRECONFIG时这很重要。
最初我只在设置INTERNET_FLAG_RELOAD时才看到问题,但很快一切都会降级,以至于普通的香草连接也失败了。
tl; dr 打开IE以便它可以祝福您的系统
答案 3 :(得分:1)
这些用户是否使用代理?如果他们在IE中设置了代理服务器,则可能会收集信息并导致您的错误。
另外,我同意休。有时GetLastError()可能会产生误导。如果你想使用它,你应该在打电话之前确保你有SetLastError(0),否则你可能会得到一些先前方法调用设置的错误代码。
答案 4 :(得分:1)
尝试以下内容:
出错时,挂钩SetLastError函数(通过使用热补丁,或使用MS Detours或其他东西手动),然后再次调用InternetOpenUrl。
在挂钩函数中,如果SetLastError参数不为零,则创建一个minidump。您将获得设置该错误的位置。