2

在 Windows Vista 上使用 MFC wininet 类时,我不断收到错误 12029(错误 INTERNET CANNOT CONNECT,连接到服务器的尝试失败。)。错误的原因是由于 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();
4

1 回答 1

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");

(设计为控制台程序,确保包含正确的头文件/库)

于 2009-08-18T02:37:00.233 回答