获取网页ed2k链接桌面程序实现
2012-07-23 18:21
232 查看
使用boost libcurl win32sdk
Thread Regex LibcURL
唉,挫得要死....最后发现VeryCD竟然有复制链接功能.
不过记录下来吧.也很有用
本文出自 “冰狐浪子的博客” 博客,请务必保留此出处http://bhlzlx.blog.51cto.com/3389283/940083
Thread Regex LibcURL
唉,挫得要死....最后发现VeryCD竟然有复制链接功能.
不过记录下来吧.也很有用
#define WIN32_LEAN_AND_MEAN #include <windows.h> #include <boost/thread.hpp> #include <boost/regex.hpp> #include <boost/lambda/lambda.hpp> #include <algorithm> #include <cstring> #include <cstdlib> #include <string> #include <iostream> #include <vector> #include <curl/curl.h> #include "resource.h" #define SAMPLE_URL "http://www.verycd.com/topics/146220/" #define WM_PARSE_COMPLETE WM_USER+1 HINSTANCE hInst; HWND main_hwnd; HWND result_text; CURL * main_curl; typedef struct downloadData { int size; void * pData; }DOWNLOADDATA,*LPDOWNLOADDATA; DOWNLOADDATA data; char url[512]; std::vector<std::string> ed2klinks; boost::thread * pThread; size_t write_callback( void *ptr, size_t size, size_t nmemb, void *userdata); void start_getting_links(); BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) { case WM_INITDIALOG: /* * TODO: Add code to initialize the dialog. */ return TRUE; case WM_PARSE_COMPLETE: { std::string all; std::for_each( ed2klinks.begin(), ed2klinks.end(), all+=boost::lambda::_1 ); HWND hBT = ::GetDlgItem(main_hwnd,IDC_BTN_START); ::EnableWindow(hBT,TRUE); ::SetWindowText(result_text,all.c_str()); } ed2klinks.clear(); ::MessageBox(NULL,"获取完毕!","提示",MB_OK); break; case WM_CLOSE: PostQuitMessage(0); return TRUE; case WM_COMMAND: switch(LOWORD(wParam)) { /* * TODO: Add more control ID's, when needed. */ case IDC_BTN_QUIT: ::PostQuitMessage(0); return TRUE; case IDC_BTN_START: ::GetDlgItemText(main_hwnd,IDC_EDIT_URL,url,512); boost::regex url_expression("http://.*"); char * begin = url; char * end = url+strlen(url); boost::match_results<char *> result; if( ! boost::regex_match(begin,end,result,url_expression,boost::match_default)) { ::MessageBox(NULL,"地址不合法","错误",MB_OK); return TRUE; } pThread = new boost::thread(&start_getting_links); pThread->timed_join(boost::posix_time::milliseconds(1)); printf("start"); //printf((char *)data.pData); //MessageBox(hwndDlg, "You clicked \"Test\" button!", "Information", MB_ICONINFORMATION); return TRUE; } } return FALSE; } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { hInst = hInstance; MSG messages; // The user interface is a modal dialog box main_hwnd = ::CreateDialog(hInstance, MAKEINTRESOURCE(DLG_MAIN), NULL, (DLGPROC)DialogProc); result_text = ::GetDlgItem(main_hwnd,IDC_EDIT_RESULT); ::SetWindowText(::GetDlgItem(main_hwnd,IDC_EDIT_URL),"http://www.verycd.com/topics/67240/"); ::ShowWindow(main_hwnd,SW_NORMAL); ::SendMessage(main_hwnd, WM_SETICON, ICON_SMALL, (LPARAM)::LoadImage( hInst, MAKEINTRESOURCE(IDI_MAIN), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR)); ::SendMessage(main_hwnd, WM_SETICON, ICON_BIG, (LPARAM)::LoadImage( hInst, MAKEINTRESOURCE(IDI_MAIN), IMAGE_ICON, GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), LR_DEFAULTCOLOR)); while (GetMessage (&messages, NULL, 0, 0)) { /* Translate virtual-key messages into character messages */ TranslateMessage(&messages); /* Send message to WindowProcedure */ DispatchMessage(&messages); } return 0; //return DialogBox(hInstance, MAKEINTRESOURCE(DLG_MAIN), NULL, (DLGPROC)DialogProc); } size_t write_callback( void *ptr, size_t size, size_t nmemb, void *userdata) { size_t data_size = size * nmemb; DOWNLOADDATA * pData = (LPDOWNLOADDATA)userdata; pData->pData = realloc(pData->pData,pData->size + data_size + 1); memcpy(pData->pData + pData->size,ptr,data_size); pData->size += data_size; ((char *)pData->pData)[pData->size] = 0; return data_size; } void start_getting_links() { HWND hBT = ::GetDlgItem(main_hwnd,IDC_BTN_START); ::EnableWindow(hBT,FALSE); main_curl = curl_easy_init(); if(!main_curl) { printf("curl init error!\n"); } curl_easy_setopt(main_curl,CURLOPT_URL,url); curl_easy_setopt(main_curl,CURLOPT_WRITEDATA,&data); memset(&data,0,sizeof(DOWNLOADDATA)); curl_easy_setopt(main_curl,CURLOPT_WRITEFUNCTION,&write_callback); curl_easy_perform(main_curl); boost::regex ed2k_expression = boost::regex("(?<link>ed2k://\\\|file\\\|[^\\\">]*\\\|/)"); char * begin = (char*)data.pData; char * end = (char*)data.pData + data.size; boost::match_results< char* > result; while(boost::regex_search(begin,end,result,ed2k_expression,boost::match_default)) { std::string temp(result[0].first,result[0].second); temp+="\r\r\n"; if(!ed2klinks.empty()) { if(temp.compare(ed2klinks[ed2klinks.size()-1]) != 0) { ed2klinks.push_back(temp); } } else { ed2klinks.push_back(temp); } begin = result[0].second; } free(data.pData); data.pData = NULL; data.size = 0; PostMessage(main_hwnd,WM_PARSE_COMPLETE,NULL,NULL); return; }
本文出自 “冰狐浪子的博客” 博客,请务必保留此出处http://bhlzlx.blog.51cto.com/3389283/940083
相关文章推荐
- 利用Register protocol实现网页调用桌面程序
- 自定义URL Protocol调用Winfrom程序(exe)并实现传值——类似网页链接调用QQ、旺旺
- 利用Register protocol实现网页调用桌面程序
- 通过注册新协议实现网页链接打开本地程序
- C#获取远程网页中的所有链接URL(网络蜘蛛实现原理)
- C#获取远程网页中的所有链接URL(网络蜘蛛实现原理)
- 利用Register protocol实现网页调用桌面程序(类似迅雷、QQ等)
- C#获取远程网页中的所有链接URL(网络蜘蛛实现原理)
- 用Qt实现一个桌面弹幕程序(十)-- -- 网页服务端的实现①
- C#获取远程网页中的所有链接URL(网络蜘蛛实现原理)
- 正则表达式入门知识+用它实现在一个网页中获取所有的链接地址
- C#获取远程网页中的所有链接URL(网络蜘蛛实现原理)
- 利用Register protocol实现网页调用桌面程序(类似迅雷、QQ等)
- javascript 网页中实现一个计算当年还剩多少时间的倒数计时程序(转)
- 实现一个简单的网页(缩略词表、文献来源链接、快速访问键列表)
- 网页上打开桌面程序
- silverlight 初始页面进行安装主应用(初始安装xap,本地加载xap),实现silverlight程序成桌面应用程序。
- java-httpclient通过title实现从baidu爬取相关网页链接
- 用js实现网页上模仿桌面右键菜单
- java抓取网页数据获取网页中所有的链接实例分享