使用boost libcurl win32sdk

Thread Regex LibcURL

唉,挫得要死....最后发现VeryCD竟然有复制链接功能.

不过记录下来吧.也很有用

  1. #define WIN32_LEAN_AND_MEAN
  2. #include <windows.h>
  3. #include <boost/thread.hpp>
  4. #include <boost/regex.hpp>
  5. #include <boost/lambda/lambda.hpp>
  6. #include <algorithm>
  7. #include <cstring>
  8. #include <cstdlib>
  9. #include <string>
  10. #include <iostream>
  11. #include <vector>
  12. #include <curl/curl.h>
  13. #include "resource.h"
  14. #define SAMPLE_URL "http://www.verycd.com/topics/146220/"
  15. #define WM_PARSE_COMPLETE WM_USER+1
  16. HINSTANCE hInst;
  17. HWND main_hwnd;
  18. HWND result_text;
  19. CURL * main_curl;
  20. typedef struct downloadData
  21. {
  22. int size;
  23. void * pData;
  24. }DOWNLOADDATA,*LPDOWNLOADDATA;
  25. DOWNLOADDATA data;
  26. char url[512];
  27. std::vector<std::string> ed2klinks;
  28. boost::thread * pThread;
  29. size_t write_callback( void *ptr, size_t size, size_t nmemb, void *userdata);
  30. void start_getting_links();
  31. BOOL CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
  32. {
  33. switch(uMsg)
  34. {
  35. case WM_INITDIALOG:
  36. /*
  37. * TODO: Add code to initialize the dialog.
  38. */
  39. return TRUE;
  40. case WM_PARSE_COMPLETE:
  41. {
  42. std::string all;
  43. std::for_each(
  44. ed2klinks.begin(),
  45. ed2klinks.end(),
  46. all+=boost::lambda::_1
  47. );
  48. HWND hBT = ::GetDlgItem(main_hwnd,IDC_BTN_START);
  49. ::EnableWindow(hBT,TRUE);
  50. ::SetWindowText(result_text,all.c_str());
  51. }
  52. ed2klinks.clear();
  53. ::MessageBox(NULL,"获取完毕!","提示",MB_OK);
  54. break;
  55. case WM_CLOSE:
  56. PostQuitMessage(0);
  57. return TRUE;
  58. case WM_COMMAND:
  59. switch(LOWORD(wParam))
  60. {
  61. /*
  62. * TODO: Add more control ID's, when needed.
  63. */
  64. case IDC_BTN_QUIT:
  65. ::PostQuitMessage(0);
  66. return TRUE;
  67. case IDC_BTN_START:
  68. ::GetDlgItemText(main_hwnd,IDC_EDIT_URL,url,512);
  69. boost::regex url_expression("http://.*");
  70. char * begin = url;
  71. char * end = url+strlen(url);
  72. boost::match_results<char *> result;
  73. if( ! boost::regex_match(begin,end,result,url_expression,boost::match_default))
  74. {
  75. ::MessageBox(NULL,"地址不合法","错误",MB_OK);
  76. return TRUE;
  77. }
  78. pThread = new boost::thread(&start_getting_links);
  79. pThread->timed_join(boost::posix_time::milliseconds(1));
  80. printf("start");
  81. //printf((char *)data.pData);
  82. //MessageBox(hwndDlg, "You clicked \"Test\" button!", "Information", MB_ICONINFORMATION);
  83. return TRUE;
  84. }
  85. }
  86. return FALSE;
  87. }
  88. int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
  89. {
  90. hInst = hInstance;
  91. MSG messages;
  92. // The user interface is a modal dialog box
  93. main_hwnd = ::CreateDialog(hInstance, MAKEINTRESOURCE(DLG_MAIN), NULL, (DLGPROC)DialogProc);
  94. result_text = ::GetDlgItem(main_hwnd,IDC_EDIT_RESULT);
  95. ::SetWindowText(::GetDlgItem(main_hwnd,IDC_EDIT_URL),"http://www.verycd.com/topics/67240/");
  96. ::ShowWindow(main_hwnd,SW_NORMAL);
  97. ::SendMessage(main_hwnd, WM_SETICON, ICON_SMALL, (LPARAM)::LoadImage(
  98. hInst,
  99. MAKEINTRESOURCE(IDI_MAIN),
  100. IMAGE_ICON,
  101. GetSystemMetrics(SM_CXSMICON),
  102. GetSystemMetrics(SM_CYSMICON),
  103. LR_DEFAULTCOLOR));
  104. ::SendMessage(main_hwnd, WM_SETICON, ICON_BIG, (LPARAM)::LoadImage(
  105. hInst,
  106. MAKEINTRESOURCE(IDI_MAIN),
  107. IMAGE_ICON,
  108. GetSystemMetrics(SM_CXSMICON),
  109. GetSystemMetrics(SM_CYSMICON),
  110. LR_DEFAULTCOLOR));
  111. while (GetMessage (&messages, NULL, 0, 0))
  112. {
  113. /* Translate virtual-key messages into character messages */
  114. TranslateMessage(&messages);
  115. /* Send message to WindowProcedure */
  116. DispatchMessage(&messages);
  117. }
  118. return 0;
  119. //return DialogBox(hInstance, MAKEINTRESOURCE(DLG_MAIN), NULL, (DLGPROC)DialogProc);
  120. }
  121. size_t write_callback( void *ptr, size_t size, size_t nmemb, void *userdata)
  122. {
  123. size_t data_size = size * nmemb;
  124. DOWNLOADDATA * pData = (LPDOWNLOADDATA)userdata;
  125. pData->pData = realloc(pData->pData,pData->size + data_size + 1);
  126. memcpy(pData->pData + pData->size,ptr,data_size);
  127. pData->size += data_size;
  128. ((char *)pData->pData)[pData->size] = 0;
  129. return data_size;
  130. }
  131. void start_getting_links()
  132. {
  133. HWND hBT = ::GetDlgItem(main_hwnd,IDC_BTN_START);
  134. ::EnableWindow(hBT,FALSE);
  135. main_curl = curl_easy_init();
  136. if(!main_curl)
  137. {
  138. printf("curl init error!\n");
  139. }
  140. curl_easy_setopt(main_curl,CURLOPT_URL,url);
  141. curl_easy_setopt(main_curl,CURLOPT_WRITEDATA,&data);
  142. memset(&data,0,sizeof(DOWNLOADDATA));
  143. curl_easy_setopt(main_curl,CURLOPT_WRITEFUNCTION,&write_callback);
  144. curl_easy_perform(main_curl);
  145. boost::regex ed2k_expression = boost::regex("(?<link>ed2k://\\\|file\\\|[^\\\">]*\\\|/)");
  146. char * begin = (char*)data.pData;
  147. char * end = (char*)data.pData + data.size;
  148. boost::match_results< char* > result;
  149. while(boost::regex_search(begin,end,result,ed2k_expression,boost::match_default))
  150. {
  151. std::string temp(result[0].first,result[0].second);
  152. temp+="\r\r\n";
  153. if(!ed2klinks.empty())
  154. {
  155. if(temp.compare(ed2klinks[ed2klinks.size()-1]) != 0)
  156. {
  157. ed2klinks.push_back(temp);
  158. }
  159. }
  160. else
  161. {
  162. ed2klinks.push_back(temp);
  163. }
  164. begin = result[0].second;
  165. }
  166. free(data.pData);
  167. data.pData = NULL;
  168. data.size = 0;
  169. PostMessage(main_hwnd,WM_PARSE_COMPLETE,NULL,NULL);
  170. return;
  171. }

转载于:https://blog.51cto.com/bhlzlx/940083

获取网页ed2k链接桌面程序实现相关推荐

  1. Android 使用JS注入获取网页视频链接

    Android 使用JS注入获取网页视频链接 思路: 1.通过js注入获取整个网页html. 2.通过jsoup分析获取video播放器的数据源. 一.开启webviewjs功能,注入js回调 mWe ...

  2. php 页面生成外部链接,php 获取网页外部链接正则表达式

     代码如下 复制代码 preg_match_all("//i",$webContent,$link); $urls =array(); foreach($link[0] as $v ...

  3. header python 环境信息_python获取网页header头部信息(python小白学习笔记二)

    方法一:代码查看 通过python获取网页的链接url,返回码,以及相关的信息 #对反爬虫网页,可以设置一些headers信息,模拟成浏览器取访问网站 import urllib.request ur ...

  4. web网页浏览器唤起wpf,winform exe桌面程序,并跳转到指定页面

    背景案例 我们看到网页上打开百度网盘,下载的时候会通过浏览器唤起百度网盘桌面端,并进入到指定页面,我们要做的,就是达到类似的效果 实现流程 1.写注册表 在桌面软件首次启动的时候,像注册表中写入程序的 ...

  5. .NET 桌面程序集成Web网页多种解决方案

    前言 B/S架构的Web程序几乎占据了应用软件的绝大多数市场,但是C/S架构的WinForm.WPF客户端程序依然具有很实用的价值,如设计类软件 AutoCAD与Autodesk Revit.WPS. ...

  6. 如何在网页中打开一个本地桌面程序

    如何在网页中打开一个本地桌面程序 转载 2015年11月26日 20:30:14 1473 通过网页链接打开本地本地程序,想到最多的方法就是通过activex控件,但这里介绍一个通过注册新协议来打开本 ...

  7. 批量采集html软件,在线批量获取网页链接工具 浏览器插件版-♚付涛纪实阁♚

    这两天在弄网站蜜蜂采集的时候,发现原来收藏的一个[在线批量获取网页链接工具]工具对应的网站已经不知道什么原因打不开了:在百度里面通过这个词去一搜索,一初搜索,看到百度结果里面拥有大量的匹配信息,但是经 ...

  8. Nativefier 网页转桌面程序 app

    Nativefier 网页转桌面程序 Nativefier简介 Nativefier是一个命令行工具,仅仅通过一行代码就可以轻松地为任何的网站创建桌面应用程序,应用程序通过Electron打包成系统可 ...

  9. 如何用php获取网页表格,PHP获取网页上任意表格中内容的通用程序的制作

    在工作中,经常需要对网页上的表格内容进行处理,但是,由于表格内容制作过程中的随意性,跨行跨列经常发生,所以我作了这几个函数,以获取表格的内容,程序中重要的地方已作了注解,所以在此不再重复说明,经过测试 ...

最新文章

  1. @老板:别开视频会议了,效率低没人care,斯坦福、微软都可以作证
  2. linux修改ip地址方法如何保存_修改电脑IP地址方法
  3. 条码软件调用ERP系统
  4. 像Java这样的C ++具有低延迟
  5. Spring3.1+Quertz1.8实现多个计划任务
  6. Web前端笔记-2D图形平面内平移定位(two.js)
  7. 深入理解SpringBoot(1)
  8. oc c语言,OC之C语言的基础知识
  9. python 近期用到的基础知识汇总(六)
  10. centos7开启网卡命令_centos7如何启动网卡
  11. java 期刊杂志参考_各系列普刊期刊的推荐,大家可供参考
  12. 2005/2006/2007/2008/2009/2010/2012/2013/2014/2015/2016/2017/2018/2019/2020高德poi一级类别 二级类别 三级类别
  13. MCU之芯唐ARM9(转)
  14. 数据分析处理之词频统计
  15. ajax dojo deferred,Dojo学习-14:Ajax with dojo/request
  16. 初中学考英语听说计算机考试,2018中考英语听说计算机考试工作重要通知
  17. php tdd,用phpUnit入门TDD
  18. UG/NX二次开发 单位化向量 UF_VEC3_unitize
  19. [硬件选型] 工业镜头之参数和选型
  20. U3d 实现 邮箱发送

热门文章

  1. 物理机搭建黑群晖DSM6.2
  2. python实现朋友圈跟发_用Python发一个高逼格的朋友圈「附代码」
  3. 当Myelipse遇上Git(旺旺篇)
  4. 跨桌面端Web容器演进
  5. RStudio下载与安装
  6. #python注释代码对吗,以下Python注释代码不正确的是()。A.()#()Python注释代码()B.()#Python...
  7. jq循环判断input框
  8. 小程序销毁页面的方法
  9. oracle 读写分离 DG,数据库读写分离解决方案--DG实施方案范文
  10. 如何将mkv视频转换成mpg视频格式