posts - 23,  comments - 20,  trackbacks - 0
 
     摘要: 费了九牛二虎之力  终于让我把二弄出来了...不好弄啊  本来都准备算了哎  技术人员  哪能那么简单说放弃 ...最后用了一个最笨的方法终于实现了要求这次由于时间很匆忙  所以 界面方面没有做任何工作  速度的计算也没有  本来是准备用线程池的  试验了一下  最后还是做老本行吧...自己创建线程没有什么多...  阅读全文
posted @ 2009-08-18 17:28 李佳 阅读(403) | 评论 (0)编辑 收藏
最近工作比较轻松  现在没事不能不写代码  呵呵 闲着没事  想做个下载工具
先大致分成三步做吧 
第一步  文件的下载  最基础
第二步  多线程连接下载文件    提高速度的关键
第三部  断点续传    非常实用

今天来实现第一步吧
文件的下载  http协议的

使用了一个VC知识库的Http类      不多说 上代码
  1 //确定按钮
  2 void CHttpDownloadDlg::OnBnClickedOk()
  3 {    
  4     ::CreateThread(NULL,0,DownloadThreadProc,(PVOID)this,NULL,NULL);    
  5 }
  6 
  7 //退出按钮
  8 void CHttpDownloadDlg::OnBnClickedCancel()
  9 {
 10     // TODO: 在此添加控件通知处理程序代码
 11     OnCancel();
 12 }
 13 
 14 //获取存储的文件夹
 15 CString CHttpDownloadDlg::GetStorgeFolde(void)
 16 {
 17     CString strFold;
 18     BROWSEINFO   bi;  
 19     TCHAR   buffer[MAX_PATH];  
 20     ZeroMemory(buffer,   MAX_PATH);  
 21     bi.hwndOwner   =   GetSafeHwnd();  
 22     bi.pidlRoot   =   NULL;  
 23     bi.pszDisplayName   =   buffer;  
 24 
 25     bi.lpszTitle   =   _T("选择一个文件夹");  
 26     bi.ulFlags   =   BIF_EDITBOX;  
 27     bi.lpfn   =   NULL;  
 28     bi.lParam   =   0;  
 29     bi.iImage   =   0;  
 30 
 31     LPITEMIDLIST   pList   =   NULL;  
 32     if   ((pList   =   SHBrowseForFolder(&bi))   !=   NULL)  
 33     {  
 34         TCHAR   path[MAX_PATH];  
 35         ZeroMemory(path,   MAX_PATH);  
 36         SHGetPathFromIDList(pList,   path);  
 37         strFold = path;
 38         UpdateData(FALSE);        
 39     }    
 40     return strFold;
 41 }
 42 
 43 //线程函数
 44 DWORD WINAPI DownloadThreadProc(LPVOID pDate)
 45 {
 46     CHttpDownloadDlg * pMainDlg = (CHttpDownloadDlg*)pDate;
 47     //pMainDlg->m_DownloadProg.SetPos(30);
 48     CHttpSocket HttpSocket;
 49     CString strServer , strObject ;
 50     USHORT uPort;
 51     DWORD dwServerType;
 52     long lLenth;
 53     const char * pRequestHeader = NULL;
 54 
 55     //通过URL获取相关参数
 56     AfxParseURL(pMainDlg->m_strDownloadAddr , dwServerType , strServer , strObject , uPort);
 57     pRequestHeader = HttpSocket.FormatRequestHeader((LPTSTR)(LPCTSTR)strServer , (LPTSTR)(LPCTSTR)strObject , lLenth );
 58     HttpSocket.Socket();
 59     HttpSocket.Connect((LPTSTR)(LPCTSTR)strServer );
 60     HttpSocket.SendRequest();
 61     HttpSocket.SetTimeout(100);
 62 
 63     char szLength[15];
 64     HttpSocket.GetField("Content-Length" , szLength , 15);
 65     int iServerState = HttpSocket.GetServerState();
 66     int iFileSize = atoi(szLength);
 67     pMainDlg->m_DownloadProg.SetRange(0,iFileSize/1024);    //设置进度条
 68     CFile file;
 69     file.Open(pMainDlg->m_strStorgePath , CFile::modeCreate | CFile::modeWrite);
 70     char szDate[2048];
 71     int iRecvSize = 0;    //读取的文件大小
 72     int iCompleteSize = 0;
 73     //DWORD dwStartTime , dwEndTime;    //暂时不计算速度
 74     while (iCompleteSize < iFileSize)
 75     {
 76         //dwStartTime = GetTickCount();
 77         iRecvSize = HttpSocket.Receive(szDate , 2048);
 78         if (iRecvSize == 0)
 79         {
 80             ::AfxMessageBox("服务器关闭链接");
 81             break;
 82         }
 83         if (iRecvSize == -1)
 84         {
 85             ::AfxMessageBox("接收数据超时");
 86             break;
 87         }
 88         //dwEndTime = GetTickCount();
 89         file.Write(szDate , iRecvSize);
 90         iCompleteSize += iRecvSize;
 91         pMainDlg->m_DownloadProg.SetPos(iCompleteSize / 1024 );        
 92     }
 93     file.Close();
 94     pMainDlg->m_DownloadProg.SetPos(0);
 95     AfxMessageBox("下载完成");
 96     return 1;
 97 }
 98 
 99 //获取存储路径   仿造迅雷的获取存储名称 尽量不要用户使用键盘
100 void CHttpDownloadDlg::OnBnClickedGetStorgePath()
101 {
102     UpdateData(TRUE);
103     if(m_strDownloadAddr == "")
104     {
105         AfxMessageBox("请输入下载地址" , MB_OK);
106         return ;
107     }
108 
109     CString strFileName = m_strDownloadAddr;
110     m_strStorgePath = GetStorgeFolde();
111 
112     while(strFileName.Find("/"!= -1)
113     {
114         int i = strFileName.Find("/");
115         strFileName = strFileName.Mid(i +1 , strFileName.GetLength() - i - 1);
116     }
117 
118     m_strStorgePath += strFileName;
119     UpdateData(FALSE);
120 }
121 
界面很简陋 


今天就先做到这

posted @ 2009-08-17 12:10 李佳 阅读(681) | 评论 (0)编辑 收藏
主要是锻炼一下自己关于进程操作方面的能力  最主要是  要用好MSDN
不废话 上代码

 1 
 2 void CEnumProcessDlg::OnBnClickedOk()
 3 {
 4     DWORD dwPIDPrcess[1024];
 5 //    DWORD dwArrSize;
 6     DWORD dwSize;
 7     
 8     ::EnumProcesses(dwPIDPrcess , 1024 , &dwSize);        //枚举进程 拿到PID 
 9     int iCount = dwSize / sizeof(DWORD);
10     for (int i = 0 ; i < iCount ; i++)    //枚举所有进程
11     {
12         HANDLE  hProcess = OpenProcess(PROCESS_ALL_ACCESS , TRUE , dwPIDPrcess[i]);
13         HMODULE hProcessModule;
14         DWORD dwEnumProcessModuleSize;
15         TCHAR szProcessName[512];
16         if (hProcess != INVALID_HANDLE_VALUE) //打开了进程
17         {
18             if (EnumProcessModules(hProcess , &hProcessModule , sizeof(HMODULE), &dwEnumProcessModuleSize))
19             {
20                 GetModuleBaseName(hProcess , hProcessModule , szProcessName , 512);                
21                 HANDLE hSnapShot = ::CreateToolhelp32Snapshot(TH32CS_SNAPMODULE , dwPIDPrcess[i]);
22                 if (hSnapShot == INVALID_HANDLE_VALUE)
23                 {
24                     CloseHandle(hProcess);
25                     continue;
26                 }
27                 MODULEENTRY32 me32;
28                 me32.dwSize = sizeof(MODULEENTRY32);
29                 if ( !Module32First(hSnapShot , &me32))
30                 {
31                     //添加出错代码
32                     CloseHandle(hSnapShot);
33                     CloseHandle(hProcess);
34                     continue;
35                 }
36                 CString strTemp;
37                 strTemp.Format(_T("%d") , dwPIDPrcess[i]);
38                 m_strProcessName += szProcessName ;    //进程名称
39                 m_strProcessName += _T("              ");
40                 m_strProcessName +=me32.szExePath;        //程序的存放路径
41                 m_strProcessName += _T("   ");
42                 m_strProcessName += strTemp;                //PID
43                 m_strProcessName += _T("\r\n");
44         
45                 UpdateData(FALSE);
46                 CloseHandle(hSnapShot);
47                 CloseHandle(hProcess);
48             }//
49 
50         }
51     }
52     //OpenProcess
53     //OnOK();
54 }
代码很短吧...
上图片  执行的效果图


posted @ 2009-08-15 17:47 李佳 阅读(210) | 评论 (0)编辑 收藏
仅列出标题
共3页: 1 2 3 
<2024年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用链接

留言簿

随笔分类

随笔档案

文章档案

相册

搜索

  •  

最新评论

阅读排行榜

评论排行榜