工控编程吧
标题:
175上位机VC MFC下载网络文件到指定目录
[打印本页]
作者:
qq263946146
时间:
2016-1-17 20:56
标题:
175上位机VC MFC下载网络文件到指定目录
(, 下载次数: 0)
上传
点击文件名下载附件
175上位机VC MFC下载网络文件到指定目录
功能展示
从网络下载一些资源文件是再常见不过的事了,我们当前例程人实现从网络下载文件,保存到指定目录功能,点击下载后,开始下载且会显示下载进度,点击终止,停止下载,效果如图;
要点提示
从网络上下载文件可以用函数URLDownloadToFile(),函数的使用会有些繁琐,我们看下函数的原型
HRESULT URLDownloadToFile( LPUNKNOWN pCaller, LPCSTRszURL, LPCSTR szFileName, DWORD dwReserved, LPBINDSTATUSCALLBACK lpfnCB );
pCaller //控件的接口,如果不是控件则为0.
szURL //要下载的url地址,不能为空.
szFileName //下载后保存的文件名
dwReserved //保留字段,必需为0
lpfnCB //下载进度状态回调
返回值有S_OK 下载成功 ;E_OUTOFMEMORY缓存区长度或内存空间不足; INET_E_DOWNLOAD_FAILURE指定资源或回调接口非法
实现功能
1.新建基于对话框的应用程序
2.拖拽一组合框用于显示要下载的文件ID为IDC_COMBO1;拖拽下载,停止下载按钮关联函数;拖拽进度条控件ID为IDC_PROGRESS1用于显示下载进度;
3.初始化组合框,添加些文件供下载测试
CComboBox* pCombox = (CComboBox*)GetDlgItem(IDC_COMBO1);//初始化组合框
pCombox->InsertString(0,"VC6.0"); pCombox->InsertString(0,"MSDN6.0");
pCombox->InsertString(0,"VC6.0助手"); pCombox->SetCurSel(0);
4.在程序退出时我们创建一个INI文件与写入下载地址到此文件,用于下载测试用
void CGkbc8Dlg::OnDestroy()
{
CDialog::OnDestroy();
//><向文件写入数据
char buf[MAX_PATH];
GetModuleFileName(NULL,buf,MAX_PATH);
CString sPath(buf);
sPath = sPath.Left(sPath.ReverseFind('\\')+1)+"工控编程吧.INI";
if(_access(sPath,00)==-1)
{
::CreateFile(sPath,GENERIC_WRITE|GENERIC_READ,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
复制代码
CREATE_NEW,
FILE_ATTRIBUTE_NORMAL,
NULL);
}
::WritePrivateProfileString("FILES","VC6.0","http://pcr4.pc6.com/rm/VC6.0.rar",sPath);
::WritePrivateProfileString("FILES","VC6.0助手","http://down1.cr173.com/soft1/VC6.0_VA_X.zip",sPath);
::WritePrivateProfileString("FILES","MSDN6.0","http://big2.pc6.com/big2/MSDNLibraryVisualStudio6.0.zip",sPath);
}
复制代码
5.开始实现下载网络文件功能,下载按钮的函数为
void CGkbc8Dlg::OnDownload()
{
//开线程下载
CWinThread* pThread = AfxBeginThread(
ThreadFunc1,
this,
THREAD_PRIORITY_NORMAL,
0,
0);
ASSERT_VALID( pThread );
}
复制代码
ThreadFunc1为线程一函数
UINT ThreadFunc1( LPVOID lParam )
{
CGkbc8Dlg* pParent = (CGkbc8Dlg*)lParam;
pParent->DownloadFile();
return 0;
}
复制代码
DownloadFile()为添加的自定义函数
void CGkbc8Dlg::DownloadFile()
{
CComboBox* pCombox = (CComboBox*)GetDlgItem(IDC_COMBO1);
CString sKey;
pCombox->GetWindowText(sKey);
//
char buf[MAX_PATH];
GetModuleFileName(NULL,buf,MAX_PATH);
CString sPath(buf);//参数文件地址
sPath = sPath.Left(sPath.ReverseFind('\\')+1)+"工控编程吧.INI";
//
::GetPrivateProfileString("FILES",sKey,"",buf,MAX_PATH,sPath);//获取下载地址
sPath = buf;
sPath = sPath.Right(sPath.GetLength()-sPath.ReverseFind('/')-1);//获得文件名
CString sSaveTo("D:\");
sSaveTo+=sPath;//获取保存路径
//开始下载
m_Download.SetParentWnd(this);
if(S_OK !=::URLDownloadToFile(NULL,buf,sSaveTo,0,&m_Download)&&m_Download.GetStopState())//UI会阻塞,建议开个线程
AfxMessageBox("Failed Download");
}
复制代码
m_Download为自定义类变量CBindCallbackm_Download; ,类的文件代码过长,可以从例程复制
终止下载按钮函数
void CGkbc8Dlg::OnStop()
{
m_Download.Stop();
}
复制代码
最后是下载的进度显示函数void SetDownloadProgress(ULONG ulProgress, ULONGulProgressMax,ULONG ulSatusCode,LPCWSTR szStatusText);
我们来演示整个功能实现过程
[iqiyi]http://player.video.qiyi.com/a95c9f9e36149772130245e26533201a/0/0/w_19rtdwfz39.swf-albumId=5199692809-tvId=5199692809-isPurchase=0-cnId=12[/iqiyi]
(, 下载次数: 0)
上传
点击文件名下载附件
[note]1[/note]
欢迎光临 工控编程吧 (https://www.gkbc8.com/)
Powered by Discuz! X3.4