使用Afxinet开发页面下载程序时,CInternetSession::OpenURL抛出错误1168
解决Afxinet调用OpenURL时抛出错误代码1168的问题
错误代码1168对应Win32的ERROR_NOT_FOUND,本质是请求的资源无法被定位到。结合你的代码场景,核心原因和修复方案如下:
目标站点已切换至HTTPS协议
当前http://ip.chacha.cn大概率强制跳转至HTTPS,继续用HTTP请求会直接触发资源找不到的错误。修改URL为L"https://ip.chacha.cn",同时调整CInternetSession初始化参数以支持HTTPS:CInternetSession session(L"Client", 1, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, INTERNET_FLAG_SECURE);另外确保项目链接时包含
wininet.lib和secur32.lib两个依赖库。禁止强制转换
CHttpFile*,先做类型校验session.OpenURL返回的CInternetFile子类不一定是CHttpFile,强制转换会引发未定义行为,正确做法是先判断类型:CInternetFile* pFile = session.OpenURL(url); if (!pFile) { DWORD dwError = GetLastError(); // 这里添加错误处理逻辑 return; } CHttpFile* pHtmlFile = dynamic_cast<CHttpFile*>(pFile); if (!pHtmlFile) { pFile->Close(); delete pFile; return; }处理HTTP重定向场景
即使保留HTTP协议,站点可能返回3xx重定向响应,OpenURL默认不自动处理,可添加参数强制刷新并跳过缓存:CInternetFile* pFile = session.OpenURL(url, 1, INTERNET_FLAG_RELOAD | INTERNET_FLAG_DONT_CACHE);修复字符编码转换问题
你代码中用sprintf处理宽字符CString会导致乱码,改用多字节字符串转换:CStringA dataA(data); strcpy(ipline, dataA.GetString());
修改后的完整示例代码
CInternetSession session(L"Client", 1, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, INTERNET_FLAG_SECURE); wchar_t* url = L"https://ip.chacha.cn"; CInternetFile* pFile = session.OpenURL(url); if (!pFile) { DWORD dwError = GetLastError(); // 错误处理,比如输出错误码 return; } CHttpFile* pHtmlFile = dynamic_cast<CHttpFile*>(pFile); if (!pHtmlFile) { pFile->Close(); delete pFile; return; } DWORD dwStatusCode; pHtmlFile->QueryInfoStatusCode(dwStatusCode); if (dwStatusCode == HTTP_STATUS_OK) { CString data; DWORD count = 0; char ipline[500] = { 0 }; while (pHtmlFile->ReadString(data)) { count++; if (count == 96) { CStringA dataA(data); strcpy(ipline, dataA.GetString()); IPv4_GET(ipline, strlen(ipline), ip); break; } } } // 记得释放资源 pHtmlFile->Close(); delete pHtmlFile;
内容的提问来源于stack exchange,提问作者Emeyedn
相关产品推荐
相关产品推荐

