摘要: 費了九牛二虎之力 終于讓我把二弄出來了...不好弄啊 本來都準備算了哎 技術人員 哪能那么簡單說放棄 ...最后用了一個最笨的方法終于實現了要求這次由于時間很匆忙 所以 界面方面沒有做任何工作 速度的計算也沒有 本來是準備用線程池的 試驗了一下 最后還是做老本行吧...自己創建線程沒有什么多...
閱讀全文
posted @
2009-08-18 17:28 李佳 閱讀(424) |
評論 (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 李佳 閱讀(706) |
評論 (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 李佳 閱讀(224) |
評論 (0) |
編輯 收藏