如何读取Windows系统中的代理设置
如何读取Windows系统中的代理设置
嗨,我来帮你搞定读取Windows代理设置的问题!你提到用InternetQueryOption没成功,大概率是没掌握这个API的正确用法——它需要先获取缓冲区大小,再分配内存读取,我给你一步步讲清楚,再附上可以直接跑的代码。
首先,InternetQueryOption需要搭配INTERNET_PROXY_INFO结构体来使用,这个结构体里包含了代理的访问类型和代理字符串。关键是代理字符串的长度不固定,所以不能直接用固定大小的结构体,得先调用一次API获取所需的缓冲区大小,再分配足够的内存来存实际数据。
给你一个完整的示例代码(C++),刚好能处理你说的两种场景:
#include <windows.h> #include <wininet.h> #include <iostream> #include <string> #pragma comment(lib, "wininet.lib") int main() { DWORD bufferSize = 0; INTERNET_PROXY_INFO proxyInfo; // 第一次调用:获取存储代理信息所需的缓冲区大小 if (!InternetQueryOption(NULL, INTERNET_OPTION_PROXY, &proxyInfo, &bufferSize) && GetLastError() == ERROR_INSUFFICIENT_BUFFER) { // 根据获取到的大小分配内存 INTERNET_PROXY_INFO* pProxyInfo = reinterpret_cast<INTERNET_PROXY_INFO*>(malloc(bufferSize)); if (pProxyInfo == NULL) { std::cerr << "内存分配失败!" << std::endl; return 1; } // 第二次调用:读取实际的代理信息 if (InternetQueryOption(NULL, INTERNET_OPTION_PROXY, pProxyInfo, &bufferSize)) { if (pProxyInfo->dwAccessType == INTERNET_OPEN_TYPE_PROXY) { // 代理已启用,输出你要的代理字符串 std::cout << "代理设置:" << pProxyInfo->lpszProxy << std::endl; } else { // 代理未启用,输出提示 std::cout << "No proxy server configured." << std::endl; } } else { std::cerr << "获取代理信息失败,错误码:" << GetLastError() << std::endl; } // 记得释放分配的内存 free(pProxyInfo); } else { std::cerr << "获取缓冲区大小失败,错误码:" << GetLastError() << std::endl; return 1; } return 0; }
我再给你划几个重点:
- 第一次调用
InternetQueryOption时,因为缓冲区不够会返回FALSE,但这是正常的,此时bufferSize会被设置为需要的正确大小。 - 当
INTERNET_PROXY_INFO的dwAccessType等于INTERNET_OPEN_TYPE_PROXY时,说明系统启用了代理,lpszProxy就是你要的那种分号分隔的字符串(比如http=127.0.0.1:2222;https=127.0.0.1:2222)。 - 编译时要链接
wininet.lib,代码里的#pragma comment(lib, "wininet.lib")就是干这个的,不然会出现链接错误。
如果你之前的代码没做“先获取缓冲区大小”这一步,那大概率是因为缓冲区太小,导致读取失败或者截断了代理字符串,按照上面的代码改应该就能解决问题啦。
备注:内容来源于stack exchange,提问作者Joe J
相关产品推荐
相关产品推荐

