c++ - WinINet InternetGetProxyInfo : error 1003 ERROR_CAN_NOT_COMPLETE

标签 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 的实现,除非我的包含有问题或类似的问题..?

最佳答案

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

Microsoft Windows HTTP Services (WinHTTP) is targeted at middle-tier and back-end server applications that require access to an HTTP client stack. Microsoft Windows Internet (WinINet) provides an HTTP client stack for client applications, as well as access to the File Transfer Protocol (FTP), SOCKSv4, and Gopher protocols. http://msdn.microsoft.com/en-us/library/windows/desktop/aa384068(v=vs.85).aspx

如果您真的想使用 WinHTTP,您绝对可以在动态加载“jsproxy.dll”时让它正常工作,然后使用此动态加载的 DLL 中的 InternetGetProxyInfo,如所述 here .

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

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

所有这些都是相当大的努力,只有当我真的不能使用 WinINet 时,我才会这样做。

关于c++ - WinINet InternetGetProxyInfo : error 1003 ERROR_CAN_NOT_COMPLETE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7847371/

相关文章:

c++ - 数组 :/有问题

c++ - 如何安全地防止在Wininet中调用状态回调函数?

delphi - 如何使用 WinInet 在 Delphi 2010 中发送 HTTP Post 请求

c++ - WinInet 未定义标识符

c++ - 下载 Twitter 搜索页面时出现问题

c++ - main() 不执行,但编译

c++ - 重载运算符 |干扰 Qt 枚举常量

c++ - 如何为这个例子中的所有参数设置相同的类型?

c++ - 在第三方库中正确使用 const_cast

vb.net - 如何找出非托管 dll 的正确参数结构?