在Windows Vista上使用MFC wininet类时,我一直收到错误12029(错误互联网无法连接,尝试连接服务器失败。)。导致错误的原因是Windows Defender。有没有比完全关闭Windows Defender更好的解决方法?我试图关闭“实时保护”无济于事,我不得不完全关闭WD以阻止12029错误。
如果没有更好的解决方案,希望有同样问题的其他人会看到这个问题,并能够解决他们自己的问题。我搜索了intertubes的高低,并没有发现wininet错误12029和WD之间的任何交叉引用。
我的参考代码
::CInternetSession session;
::CHttpConnection* connection = session.GetHttpConnection(L"twitter.com",80,m_csUserName,m_csPassword);
::CHttpFile* httpfile = connection->OpenRequest(CHttpConnection::HTTP_VERB_GET,L"/account/verify_credentials.xml");
httpfile->SendRequest();
答案 0 :(得分:2)
如果Windows Defender在阻止您的程序后显示警告消息,您应该可以选择将程序添加到“允许的项目”列表中,这将允许它在未启用实时保护的情况下无阻碍地运行。诚然,如果您使用非生产/个人代码(如果Defender甚至根本不显示警告信息),这只是一个可行的选择。
也就是说,Defender可能会根据您使用wininet库的方式检测到一些可能的风险 - 是否可以使用较低级别的套接字?如果这是您使用的唯一网络代码,通过通用winsock库可以很容易地复制它,如果您使用它而不是wininet,那么Defender很可能不会阻止您的程序。
<小时/> 编辑:除了按照我在下面的评论中的建议单独测试MFC片段之外,尝试使用标准的WinAPI方式可能是值得的 - 如果wininet库出现问题,这个想法是在您的计算机上,此代码也应无法连接:
int read = 0;
char* str = "*/*", buff[1024] = {};
HINTERNET inet = InternetOpen("GRB", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
if (!(inet=InternetConnect(inet, "twitter.com", 80, "username", "password", INTERNET_SERVICE_HTTP, 0, 0)))
cout << "conn failed" << endl;
if (!(inet=HttpOpenRequest(inet, "GET", "/account/verify_credentials.xml", NULL, NULL, (const char**)&str, 0, 0)))
cout << "open failed" << endl;
if (!HttpSendRequest(inet, NULL, 0, NULL, 0))
cout << "send failed" << endl;
InternetReadFile(inet, buff, 1023, (DWORD*)&read);
cout << buff << endl;
system("pause");
(设计为控制台程序,请确保包含正确的标头/库)