下了一个下载函数,有2个问题

WhatCanIdoing 2005-03-24 05:46:02
发现 A:运行时候,对话框好象死掉一样不会动;
B:下载的文件过大时会程序会死掉;(就是不能支持大文件下载 >50M)

#include <Wininet.h>
连接器->输入 Wininet.lib
int CupdateDlg::InternetGetFile(CString szUrl, CString szFileName)
{
DWORD dwFlags;
InternetGetConnectedState(&dwFlags, 0);
CHAR strAgent[64];
HINTERNET hOpen;
if(!(dwFlags & INTERNET_CONNECTION_PROXY))
hOpen = InternetOpenA(strAgent, INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY, NULL, NULL, 0);
else
hOpen = InternetOpenA(strAgent, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
if(!hOpen)
{
AfxMessageBox("Internet连接错误!");
return -1;
}

DWORD dwSize;
CHAR szHead[] = "Accept: */*\r\n\r\n";
VOID* szTemp[65536];
HINTERNET hConnect;
CFile file;

if ( !(hConnect = InternetOpenUrlA ( hOpen, szUrl, szHead,
lstrlenA (szHead), INTERNET_FLAG_DONT_CACHE | INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_RELOAD, 0)))
{
AfxMessageBox("不能打开该URL!");
return -1;
}

if (file.Open(szFileName,CFile::modeWrite|CFile::modeCreate)==FALSE )
{
AfxMessageBox("不能打开本地的文件!");
return -1;
}

DWORD dwByteToRead = 0;
DWORD dwSizeOfRq = 4;
DWORD dwBytes = 0;

if (!HttpQueryInfo(hConnect, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER,
(LPVOID)&dwByteToRead, &dwSizeOfRq, NULL))
{
dwByteToRead = 0;
}

CString tempstring;

do
{
if (!InternetReadFile (hConnect, szTemp, 65536, &dwSize))
{
AfxMessageBox("读文件出错!");
file.Close();
return -1;
}
if (dwSize==0)
break;
else
file.Write(szTemp,dwSize);
dwBytes+=dwSize;

}while (TRUE);

file.Close();
InternetCloseHandle(hOpen);

return 0;
}
...全文
68 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
WhatCanIdoing 2005-03-25
  • 打赏
  • 举报
回复
在问问怎样使用 InternetReadFileEx 下载文件
给个例子看看
  • 打赏
  • 举报
回复
另外,界面死掉的问题,建议另外开线程来下载。
  • 打赏
  • 举报
回复
需要描述下载进度吗?
如果不需要,用 URLDownloadToFile 这个 api 吧
HRESULT URLDownloadToFile( LPUNKNOWN pCaller,
LPCTSTR szURL,
LPCTSTR szFileName,
DWORD dwReserved,
LPBINDSTATUSCALLBACK lpfnCB
);
WhatCanIdoing 2005-03-24
  • 打赏
  • 举报
回复
int CupdateDlg::InternetGetFile(CString szUrl, //要下载文件的URL
CString szFileName) //下载的文件名

InternetGetConnectedState //得到当前的网络连接信息
InternetOpenA //打开一个Internet 网络连接
InternetOpenUrlA //打开一个URL
HttpQueryInfo //查看连接的信息
InternetReadFile //读取Internet文件
kingzai 2005-03-24
  • 打赏
  • 举报
回复
use Asynchronous Wininet to handle timeout.
http://www.codeproject.com/useritems/asyncwininet.asp

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧