我正在尝试使应用程序与 WinINet 库提供的自动代理 API兼容,以便生成本地pac文件工作,并在尝试调用 InternetGetProxyInfo 时遇到错误 ERROR_CAN_NOT_COMPLETE ......
我一直关注Eric Loewenthal的帖子(dev @Microsoft所以我希望他的建议是A-OK; p)here 这个想法应该是:
以下是我的代码的样子:
// 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的实现,除非我的包含有问题或者沿着这些方向发生了什么......?
答案 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,那么所有这些都是我付出的努力。