我在一个函数中开启一个下载线程:
void ClientUpgrade::UpdateVersion(ClientUpgrade *pCUpgrade)
{
m_hProcess=CreateThread(NULL,0,QueryFileLength,(LPVOID)pCUpgrade,0,NULL);
}
然后强行关闭线程:
void ClientUpgrade::TerminateDown()
{
if(m_hProcess!=NULL)
{
if(hOpen!=NULL)
{
InternetCloseHandle(hOpen);
hOpen=NULL;
          
}
if(hConnect!=NULL)
{
InternetCloseHandle(hConnect);
hConnect=NULL;
}
::TerminateThread(m_hProcess,0);
CloseHandle(m_hProcess);
m_hProcess=NULL;
}
}
然后再继续下载时应用程序出错退出,继续下载我是调用UpdateVersion().
QueryFileLength线程函数如下:
DWORD WINAPI QueryFileLength(LPVOID lpParam)
{ ClientUpgrade *pCUpgrade=(ClientUpgrade *)lpParam;

DWORD dwFlags;
InternetGetConnectedState(&dwFlags,0);
TCHAR strAgent[64];
wsprintf(strAgent,"Agent%id",rand()%1000);
if(!(dwFlags & INTERNET_CONNECTION_PROXY))
{
pCUpgrade->hOpen=InternetOpen(strAgent,INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
}
if(!pCUpgrade->hOpen)
{
return 0;
}
pCUpgrade->m_dwRecv=0;
wsprintf(szVersionPath,"%s%s",pCUpgrade->m_szVersionDownPath,UpVersion.szFileTitle);
    if(pCUpgrade->hConnect)
{
      InternetCloseHandle(pCUpgrade->hConnect);
}
pCUpgrade->hConnect=InternetOpenUrl(pCUpgrade->hOpen,szVersionPath,NULL,0,INTERNET_FLAG_RELOAD,0);
if(pCUpgrade->hConnect==NULL)
{
AfxMessageBox("连接服务器出错!");
InternetCloseHandle(pCUpgrade->hOpen);
return 0;
}
DWORD dwByteToRead=0;
DWORD dwSizeOfRq=4;
DWORD dwBytes=0;
if(!HttpQueryInfo(pCUpgrade->hConnect,HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER,(LPVOID)&dwByteToRead,&dwSizeOfRq,NULL))
{
dwByteToRead=0;
}
                  //Sleep(5000);
pCUpgrade->m_dwRecv+=dwByteToRead;
InternetCloseHandle(pCUpgrade->hConnect); } ::PostMessage(pCUpgrade->m_hUpWnd,FILE_UPDATE_START,0,0);
wsprintf(szVersionPath,"%s%s",pCUpgrade->m_szVersionDownPath,UpVersion.szFileTitle);       
      DWORD dwSize;
     pCUpgrade->hConnect=InternetOpenUrl(pCUpgrade->hOpen,szVersionPath,NULL,0,INTERNET_FLAG_RELOAD,0);
if(pCUpgrade->hConnect==NULL)
{
::PostMessage(pCUpgrade->m_hUpWnd,FILE_UPDATE_CALCEL,0,0);
AfxMessageBox("连接服务器出错!");
InternetCloseHandle(pCUpgrade->hOpen);
return 0;
}
DWORD dwByteToRead=0;
DWORD dwSizeOfRq=4;
DWORD dwBytes=0;
if(!HttpQueryInfo(pCUpgrade->hConnect,HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER,(LPVOID)&dwByteToRead,&dwSizeOfRq,NULL))
{
dwByteToRead=0;
}

DWORD time; time=10;
VOID *szTemp[16384];
DWORD dwNumber; HANDLE hHand=pCUpgrade->CreateLocalFile(i+1);
if(hHand!=NULL)
{
do
{

if(!InternetReadFile(pCUpgrade->hConnect,szTemp,16384,&dwSize))
{
AfxMessageBox("下载文件出错!");
::PostMessage(pCUpgrade->m_hUpWnd,FILE_UPDATE_CALCEL,0,0);
return 0;
}
if(dwSize==0)
{
break;
}
else
{
WriteFile(hHand,szTemp,dwSize,&dwNumber,NULL);
dwBytes+=dwSize;
pCUpgrade->m_dwDoneRecv+=dwSize;
}
if(dwBytes==dwByteToRead)
{
pCUpgrade->AddClientVersion(&UpVersion);
CloseHandle(hHand);
if(!pCUpgrade->SaveLocalVersion(&UpVersion))
{
::PostMessage(pCUpgrade->m_hUpWnd,FILE_UPDATE_CALCEL,0,0);
return 0;
}
}
}while(TRUE);
}
}

InternetCloseHandle(pCUpgrade->hOpen);
InternetCloseHandle(pCUpgrade->hConnect);
::PostMessage(pCUpgrade->m_hUpWnd,FILE_UPDATE_OK,0,0);
return 0;
}我跟综了程序,是关闭连接之后再连接时程序运行到第一个
pCUpgrade->hConnect=InternetOpenUrl(pCUpgrade->hOpen,szVersionPath,NULL,0,INTERNET_FLAG_RELOAD,0);
时出错退出的。不知道什么原因,该关闭的我都已经关闭了。如果我没有下载那部分,只从网络上获取文件长度,我在线程中加入Sleep(2000),然后关闭连接,再连接时就没有出错,我想应该是下载那有问题,如果强行关闭下载再继续下载的话应该有什么要注意的?