4

我们产品中的互联网访问代码适用于 99.99% 的人。但是,对于其中一些人来说,它根本不起作用。我们一直在添加一些跟踪代码来尝试找出问题所在,结果 InternetOpenURL 报告错误 2 - “系统找不到指定的文件” - 来自此函数调用:

options = INTERNET_FLAG_RAW_DATA | INTERNET_FLAG_RESYNCHRONIZE;
handle = InternetOpenUrl(internet,url,NULL,0,options,0);

(internet 是使用 InternetOpen 打开的 Internet 连接的句柄,url 是存在于我们 Web 服务器上的简单文本文件的 URL。)

我们测试了两个不同的网站,一个 http 和一个 https,它们位于完全不同的地方(不同的域,托管在地理位置上的服务器),它们都给这个人和其他几个人提供了相同的错误。99% 的人,包括我们自己,都可以毫无问题地访问它们。不仅如此,受影响的人可以在他们的网络浏览器中毫无问题地访问相同的 URL。

这到底是怎么回事?:(

编辑:幸运的是,我们发现出了什么问题!事实证明,有些人在他们的 Internet 选项中选中了“为 LAN 使用代理服务器”复选框,而没有实际指定代理服务器。我们试图使用不存在的代理服务器详细信息,当然会遇到问题。

我仍然需要为此研究一个编程解决方案,但是报告问题的每个人都可以通过这个解决方案解决他们的问题:

  1. 打开 Internet Explorer
  2. 转到“工具-> Internet 选项”
  3. 单击“连接”选项卡。
  4. 底部附近应该有一个标有“LAN 设置”的按钮。点击它。
  5. 在“代理服务器”字段下,取消选中“为 LAN 使用代理服务器”
  6. 一切都单击确定,重新启动 Windows,然后再次尝试通过产品访问 Internet。

我不知道为什么这么多人选中了该框但没有指定代理服务器。但显然这是修复它需要做的。

4

5 回答 5

2

GetLastError()可能不是找出问题所在的最佳方法。从文档

要确定拒绝访问服务的原因,请调用InternetGetLastResponseInfo

于 2010-09-20T04:10:38.467 回答
2

鉴于此信息,我猜这些用户的防火墙(或某种类型的安全软件)已经挂上了 wininet 并干扰了您的通话。或者,它们可能感染了恶意软件。

于 2010-09-26T19:03:18.630 回答
2

解决方案可能就像打开 Internet Explorer 一样简单。我从不使用浏览器,但 Windows 更新中断了对 InternetOpenUrl 的调用。

打开 IE 将设置选项,以便再次读取代理信息。请注意,在 InternetOpen() 中使用 INTERNET_OPEN_TYPE_PRECONFIG 时,这一点很重要。

最初我只在设置 INTERNET_FLAG_RELOAD 时才看到问题,但很快一切都降级了,以至于普通的连接也失败了。

tl;dr打开 IE,这样它就可以祝福你的系统

于 2013-08-01T20:17:53.677 回答
1

这些用户是否使用代理?如果他们在 IE 中设置了代理,则可能会获取信息并导致您的错误。

另外,我同意休的观点。有时 GetLastError() 可能会产生误导。如果你想使用它,你应该确保你在调用之前 SetLastError(0) 否则你可能会得到一个由以前的方法调用设置的错误代码。

于 2010-09-23T16:05:03.183 回答
1

尝试以下操作:

出错时,挂钩 SetLastError 函数(手动使用热补丁,或使用 MS Detours 或其他方法),然后再次调用 InternetOpenUrl。

在挂钩函数中,如果 SetLastError 参数不为零,则进行小型转储。您将得到一个设置该错误的地方。

于 2010-09-24T15:43:32.427 回答