WinINet InternetGetProxyInfo:错误1003 ERROR_CAN_NOT_COMPLETE

时间:2011-10-21 09:19:09

标签: c++ wininet

我正在尝试使应用程序与 WinINet 库提供的自动代理 API兼容,以便生成本地pac文件工作,并在尝试调用 InternetGetProxyInfo 时遇到错误 ERROR_CAN_NOT_COMPLETE ......

我一直关注Eric Loewenthal的帖子(dev @Microsoft所以我希望他的建议是A-OK; p)here 这个想法应该是:

  • 调用InternetInitializeAutoProxyDll函数;
  • 调用InternetGetProxyInfo以获取每个给定请求的URL的代理URL;
  • 最后调用InternetDeInitializeAutoProxyDll。

以下是我的代码的样子:

// Start by initializing the Auto proxy stuff
BOOL ok = InternetInitializeAutoProxyDll(0, pathToTheProxyPACFile, 
                                         NULL, NULL, NULL);
// Here ok is true so I consider the initialization was a success

// [...]

// Later on, I try to get the proxy used for each requested URL like this:
LPSTR proxyURL = NULL;
DWORD proxyURLLength = 0;
BOOL ok = InternetGetProxyInfo(requestedURL,
                               requestedURLLength,
                               hostName,
                               hostNameLength,
                              &proxyURL,
                              &proxyURLLength);
// Here ok is false, the proxy url and length are left as is, 
// and a call to GetLastError() returns 1003 :s

我看不出有什么问题,在网上找不到任何令人信服的例子(文件严重缺乏......)。

请注意我尝试为proxyURL分配缓冲区并将其大小设置为proxyURLLength,因为文档不清楚应该如何处理内存,但它不起作用,我的理解是我应该让WinINet处理它无论如何,如果成功,请在proxyURL上使用GlobalFree。

我还尝试使用InternetCrackUrlA来获取主机名,以防万一我用来从所请求的URL获取主机名的类不适合这个API(事实上,InternetCrackUrlA认为该端口属于主机名...),但它也没有帮助。

请告诉我任何可能有助于我开展工作的建议;)

PS:我一直在使用WinHTTP在代码的相同部分做同样的事情并且它正常工作。 PPS:我在安装了IE8的Windows XP上进行测试。

编辑==========>我编写了另一个只调用这些函数的程序,在这种情况下我没有遇到任何问题,所以我猜我的问题不是来自我调用InternetGetProxyInfo的方式,而是来自我调用它时所处的状态,在...内 the event sink used for our embedded IE的实现,除非我的包含有问题或者沿着这些方向发生了什么......?

2 个答案:

答案 0 :(得分:1)

在确定它适用于新项目之后,我跟踪了我的问题的原因,并且在调用 OleInitialize 之后调用代理信息启动失败。现在,在here中有一个关于它的评论,但我不知道这个人在谈论什么(上帝知道我希望我从来不知道)所以它没有帮助我回来然后我第一次阅读它

简而言之,如果您使用OleInitialize初始化COM,您将拥有一个“单线程公寓”线程,这意味着InternetGetProxyInfo将失败并出现隐藏错误ERROR_CAN_NOT_COMPLETE。我使用的解决方案是让另一个线程完成工作。

PS关于InternetGetProxyInfo的签名:

  • 似乎最后两个参数应该设置为NULL和0,如我所料,并且应该在字符串上调用GlobalFree以在必要时释放其内存。

  • 主机名和主机名长度是可选的。

感谢您的帮助:)

答案 1 :(得分:0)

WinHTTP不应该是一个更好的WinINet,引用[MSDN] [1]:

  

Microsoft Windows HTTP服务(WinHTTP)面向需要访问HTTP客户端堆栈的中间层和后端服务器应用程序。 Microsoft Windows Internet(WinINet)为客户端应用程序提供HTTP客户端堆栈,以及访问文件传输协议(FTP),SOCKSv4和Gopher协议。    http://msdn.microsoft.com/en-us/library/windows/desktop/aa384068(V = vs.85)的.aspx

如果你真的想使用WinHTTP,你可以在动态加载“jsproxy.dll”时使用它,然后使用这个动态加载的DLL中的InternetGetProxyInfo,如here所述。

要完全支持解析复杂的PAC文件,您必须实现所有(或至少大部分)“自动代理回调函数”并将函数指针数组传递给InternetInitializeAutoProxyDll函数动态加载的DLL。

除此之外,请注意您必须处理部分代理身份验证的质询/响应处理(“域代理”除外),因为WinHTTP不会自动处理407代理密码质询并选择最佳身份验证方案WinINet呢。这也是相当多的手工工作。

如果我真的不能使用WinINet,那么所有这些都是我付出的努力。