为什么InternetOpenURL报告错误2(系统找不到指定的文件)?

时间:2010-09-16 18:15:58

标签: winapi wininet

我们产品中的互联网访问代码适用于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使用代理服务器”复选框,而没有实际指定代理服务器。我们试图使用不存在的代理服务器细节,当然也遇到了问题。

我仍然需要为此调查程序化解决方案,但报告问题的每个人都通过此解决方案解决了问题:

  1. 打开Internet Explorer
  2. 转到'工具 - >互联网选项'
  3. 点击“连接”标签。
  4. 底部附近应该有一个标有“局域网设置”的按钮。点击它。
  5. 在“代理服务器”字段下,取消选中“为LAN使用代理服务器”
  6. 单击“确定”以完成所有操作,重新启动Windows,然后再次尝试通过该产品访问Internet。
  7. 我不知道为什么有这么多人检查了这个盒子但没有指定代理服务器。但显然这是需要做的事情来解决它。

5 个答案:

答案 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。您将获得设置该错误的位置。