在CURL库请求中使用C ++ – Windows设置Internet Explorer代理

那么我想使用默认的Internet Explorer连接代理设置在cURL中的请求,这是我的示例代码:

CURL *curl; CURLcode result; curl = curl_easy_init(); char errorBuffer[CURL_ERROR_SIZE]; if (curl) { // Now set up all of the curl options curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, errorBuffer); curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_HEADER, 0); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "cookies.txt"); // Attempt to retrieve the remote page result = curl_easy_perform(curl); // Always cleanup curl_easy_cleanup(curl); } 

我该如何检索代理Internet Explorer设置,然后传递给我的cURL,以便能够使用代理发出请求?

提前致谢。

WinHttpGetIEProxyConfigForCurrentUser函数检索当前用户的Internet Explorer代理配置。

  #include "stdafx.h" #include <Windows.h> #include <Winhttp.h> #include <iostream> using namespace std; void main() { WINHTTP_CURRENT_USER_IE_PROXY_CONFIG MyProxyConfig; if(!WinHttpGetIEProxyConfigForCurrentUser(&MyProxyConfig)) { //check the error DWORD Err = GetLastError(); DWORD Err = GetLastError(); cout << "WinHttpGetIEProxyConfigForCurrentUser failed with the following error number: " << Err << endl; switch (Err) { case ERROR_FILE_NOT_FOUND: cout << "The error is ERROR_FILE_NOT_FOUND" << endl; break; case ERROR_WINHTTP_INTERNAL_ERROR: cout << "ERROR_WINHTTP_INTERNAL_ERROR" << endl; break; case ERROR_NOT_ENOUGH_MEMORY: cout << "ERROR_NOT_ENOUGH_MEMORY" << endl; break; default: cout << "Look up error in header file." << endl; }//end switch }//end if else { //no error so check the proxy settings and free any strings cout << "Auto Detect is: " << MyProxyConfig.fAutoDetect << endl; if(NULL != MyProxyConfig.lpszAutoConfigUrl) { wcout << "AutoConfigURL (MyProxyConfig.lpszAutoConfigUrl) is: " << MyProxyConfig.lpszAutoConfigUrl << endl; GlobalFree(MyProxyConfig.lpszAutoConfigUrl); } if(NULL != MyProxyConfig.lpszProxy) { wcout << "AutoConfigURL (MyProxyConfig.lpszProxy) is: " << MyProxyConfig.lpszProxy << endl; GlobalFree(MyProxyConfig.lpszProxy); } if(NULL != MyProxyConfig.lpszProxyBypass) { wcout << "AutoConfigURL (is: " << MyProxyConfig.lpszProxyBypass << endl; GlobalFree(MyProxyConfig.lpszProxyBypass); } }//end else cout << "finished!"; system("PAUSE"); }//end main 

您想要使用InternetQueryOptionINTERNET_OPTION_PROXY ( 文档 )来查找当前的代理设置,然后这只是一个传递代理设置卷曲正常的问题。

首先,使用Windows API获取代理服务器,然后使用curl_easy_setopt将代理设置为curl。

获取代理: WinHttpGetIEProxyConfigForCurrentUser这个API可以得到代理,但没有WPAD。 如果有人使用“使用自动代理配置”,应该使用WinHttpGetProxyForUrl api来获取proxy.All在msdn中: http : //msdn.microsoft.com/en-us/library/windows/desktop/aa384096( v=vs 0.85)的.aspx

设置代理: curl_easy_setopt(hCurl, CURLOPT_PROXY, astrProxy.c_str());