本文迁移自本人网易博客,写于2013年10月22日
CString sFileName;
CInternetSession iSession;
BOOL bRet = FALSE;
CStdioFile* pFileDown = NULL;
try
{
pFileDown = iSession.OpenURL(szURL, 1, INTERNET_FLAG_TRANSFER_BINARY|INTERNET_FLAG_DONT_CACHE);
}
catch(...)
{
CString sUrl = szURL;
CString sTemp = sUrl.MakeUpper();
CString sFindString = _T("/LiveUpdate/autoupdate.cgi");
sFindString.MakeUpper();
CString sShowMsg = _T("");
if (sTemp.Find(sFindString) > 0)
{
sShowMsg = sUrl.Left(sTemp.Find(sFindString));
}
AfxMessageBox("访问自动更新服务器" + sShowMsg + "失败,请检查网络是否可访问!",MB_OK|MB_ICONERROR);
//return FALSE;
}
原因:在访问URL之前使用了线程:
AfxBeginThread(WatchThreadProc,this);
将它去掉就恢复正常了,但是不明白为什么之前用了很久都没问题,最近怎么都出问题了;
而且去掉这个线程后,访问URL后异常弹出的等待时间比较长。
Debug调试时,程序运行到CThreadSlotData::GetThreadValue函数的ASSERT(m_pSlotData[nSlot].dwFlags & SLOT_USED);这一行时,异常了:
出错,弹出消息框如下所示:
错误原因:程序调用这个函数的时候,不符合他的条件
UINT WatchThreadProc(LPVOID p)
{
Sleep(10000);
if(((CLiveUpdateApp*)p)->m_bOK==FALSE)
{
ExitProcess(0);
}
return 0;
}
线程回调函数里头设置的m_bOK为FALSE时,跳出,而程序取在调用线程之前将其设置为FALSE,导致程序异常,将其置为TRUE后正常。