把.h文件里面的代码放出来一下,CPP就不放了,自己下载哦。
#ifndef Download_h__
#define Download_h__
#include <wininet.h>
#pragma comment(lib,"wininet.lib")
class CHttpGet
{
public:
//测试网络是否连接成功。
BOOL TestNetworkIsConnected();
//动态获取URL的文件名。
//LPCTSTR szURL URL地址
//LPSTR pFileName 文件名缓冲区,获取到文件名后,会文件名放入到该buffer
//DWORD dwBufferOfLenght pFileName缓冲区大小。
//pResult 是否成功。
BOOL HttpGetFileName(LPCTSTR szURL,LPSTR pFileName,DWORD dwBufferOfLenght,BOOL * pResult);
//将文件下载到缓冲区,而不是保存到文件
//szURL URL地址
//szBuffer 缓冲区。
//dwSize 缓冲区大小
//lpdwSizeOfRet实际下载到的数据大小。
DWORD URLDownloadToBuffer(LPCTSTR szURL,LPBYTE szBuffer,DWORD dwSize,DWORD *lpdwSizeOfRet);
//下载文件
//szURL URL地址
//szFileSavePath 文件完整保存路径
// CheckFileTypeIsPe 是否需要检测文件是不是PE文件。
DWORD URLDownloadToFile(LPCTSTR szURL,LPCTSTR szFileSavePath,BOOL CheckFileTypeIsPe);
};
#endif // Download_h__
CPP部分代码,详细自己下载。
完全原创。代码注释详细。
使用及其方便...
DWORD CHttpGet::URLDownloadToFile(LPCTSTR szURL,LPCTSTR szFileSavePath,BOOL CheckFileTypeIsPe)
{
if(!CheckUrl(szURL))
return FALSE;
HINTERNET hInternetOpen = InternetOpen(
"User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)",
INTERNET_OPEN_TYPE_PRECONFIG,/*返回注册表中代理或直接的配置*/
NULL,//不使用代理 所以不要设置用户名
NULL,//不使用代理 所以不用设置密码
NULL
);
if(hInternetOpen == NULL)
return FALSE;
HINTERNET hInternetUrl = InternetOpenUrl(
hInternetOpen,
szURL,
"Accept: */*",//支持左所有文件
-1,
INTERNET_FLAG_RELOAD|INTERNET_FLAG_PRAGMA_NOCACHE,/*不要从缓冲里面获取数据 */
NULL);
if(hInternetUrl == NULL)
return FALSE;
CHAR szStatus[1024]={NULL};
DWORD dwBufferLen = sizeof(szStatus);
//查询状态
HttpQueryInfo(hInternetUrl,HTTP_QUERY_STATUS_CODE,szStatus,&dwBufferLen;,NULL);
//4xx(请求错误)
DWORD dwCode = atoi(szStatus);
if( dwCode > 400 && dwCode < 500)
return FALSE;
//5xx(服务器错误)
if( dwCode >500 && dwCode < 600)
return FALSE;
//开始下载文件
HANDLE hFile = CreateFile(szFileSavePath,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if(hFile == INVALID_HANDLE_VALUE)
{
InternetCloseHandle(hInternetUrl);
InternetCloseHandle(hInternetOpen);
return FALSE;
}
CHAR szReadBuffer[4096]={NULL};
DWORD dwInternetReadOfByte = 0;
DWORD dwWriteByte = 0;
BOOL bFirst = FALSE;
BOOL bResult = TRUE;
do
{
BOOL bRet = InternetReadFile(hInternetUrl,szReadBuffer,sizeof(szReadBuffer),&dwInternetReadOfByte;);
//说明文件传送完了。
if(bRet == TRUE && dwInternetReadOfByte == 0)
break;
if(bFirst == FALSE && CheckFileTypeIsPe==TRUE)
{
bFirst = TRUE;
if(((PIMAGE_DOS_HEADER)szReadBuffer)->e_magic!= IMAGE_DOS_SIGNATURE)
{
bResult = FALSE;
break;
}
}
WriteFile(hFile,szReadBuffer,dwInternetReadOfByte,&dwWriteByte;,NULL);
} while (TRUE);
CloseHandle(hFile);
InternetCloseHandle(hInternetUrl);
InternetCloseHandle(hInternetOpen);
return bResult;
}