175上位机VC MFC下载网络文件到指定目录
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); 我们来演示整个功能实现过程
|