找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 5967|回复: 0

[分享] vs 调用com对象 Msxml2.XMLHTTP 获取网页源码

[复制链接]

1214

主题

352

回帖

11

精华

管理员

菜鸟

积分
93755

贡献奖关注奖人气王精英奖乐于助人勋章

发表于 2011-1-5 08:58:25 | 显示全部楼层 |阅读模式
到处扯 终于扯到 vs 能用的 com对象调用方式了

相信有不少人在找vs c++ 调用 com对象的方法

参考 http://topic.csdn.net/u/20070315 ... e-a78ad69b0796.html

写的非常乱 也不知道有没有资源泄露
  1. #include <Windows.h>   
  2. #include <atlstr.h>   //可以用 cstring了   
  3. #include <stdio.h>   
  4. #import <msxml3.dll>   
  5. using namespace MSXML2;   
  6. byte * XmlHttp(LPSTR szHttpAddr) //返回 byte* 必须 delete[]   
  7. {   
  8.     CoInitialize(0);   
  9.     IXMLHTTPRequestPtr http=NULL;//(__uuidof(XMLHTTP));   
  10.     http.CreateInstance("Msxml2.XMLHTTP");   
  11.     http->open("GET", szHttpAddr, false);   
  12.     http->setRequestHeader("Referer","");   
  13.     http->setRequestHeader("Accept-Language","zh-cn");   
  14.     http->setRequestHeader("Content-Type","application/x-www-form-urlencoded");   
  15.     http->send();   
  16.     _variant_t   vbin   =   http-> responseBody;   
  17.     char   *   pBuf2=NULL;   
  18.     byte *bRet=NULL;   
  19.     if (vbin.vt==(VT_ARRAY|VT_UI1))   
  20.     {   
  21.         SafeArrayAccessData(vbin.parray,(void   **)&pBuf2);   
  22.         long   size=vbin.parray-> rgsabound[0].cElements;   
  23.         //   raw   bytes   stream   utf-8   to   uniocde   ,1   get   size   
  24.         int   nwLen   =   MultiByteToWideChar(CP_ACP,0,pBuf2,-1,NULL,0);   
  25.         printf( "UTF8   String   len:%d\n ",nwLen);   
  26.         LPWSTR   lpw=new   WCHAR[nwLen];   
  27.         memset   (lpw,0,(nwLen)*sizeof(WCHAR));   //make   the   buffer   empty,   use   <memory.h>   
  28.         printf( "bytes:%d\n ",(nwLen)*sizeof(WCHAR));   
  29.         //   utf-8   to   uniocde   ,2   convert   
  30.         MultiByteToWideChar(   CP_ACP,   0,pBuf2,   size,   lpw,   nwLen   );   
  31.         BYTE   *result=new   BYTE[(nwLen)*sizeof(WCHAR)];   
  32.         memset(result,0,(nwLen)*sizeof(WCHAR));   
  33.         //   unicode   to   LPSTR   
  34.         WideCharToMultiByte(   CP_ACP,   0,lpw,   -1,(LPSTR)result,   (nwLen)*sizeof(WCHAR),   NULL,   NULL   );   
  35.         printf( "ANSI   String[%d]=%s\n ",_tcslen((LPCTSTR)result),result);   
  36.         _bstr_t   bstring((LPCTSTR)result);   
  37.         delete[]   lpw;   
  38.         delete[]   result;   
  39.         SafeArrayUnaccessData(vbin.parray);      
  40.         bRet=(byte*)lpw;   
  41.         MessageBox(NULL,   (LPCTSTR)bstring,   _T( "Results "),   MB_OK);   
  42.     }   
  43.       
  44.     http.Release();   
  45.     CoUninitialize();   
  46.     return bRet;   
  47. }   
  48. int main()   
  49. {   
  50.     system("pause");   
  51.     XmlHttp("http://www.17u2.com");   
  52.     system("pause");   
  53.     return 0;   
  54. }
复制代码
下面是我自己写的简化版  不知道我写的是否有什么隐性问题  不过看起来应该足够用了
  1. #import <msxml3.dll>   
  2. byte * XmlHttp(LPWSTR szHttpAddr,PDWORD pdwLen=0); //返回 byte* 必须 外部 free()   
  3. byte * XmlHttp(LPWSTR szHttpAddr,PDWORD pdwLen) //返回 byte* 必须 外部 free()   
  4. {   
  5.     CoInitialize(0);   
  6.     MSXML2::IXMLHTTPRequestPtr http=NULL;//(__uuidof(XMLHTTP));   
  7.     HRESULT   hr;   
  8.     hr=http.CreateInstance(L"Msxml2.XMLHTTP");   
  9.     if (hr!=0)   
  10.         return NULL;   
  11.     hr=http->open(L"GET", szHttpAddr, false);   
  12.     if (hr!=0)   
  13.     {   
  14.         if (pdwLen!=NULL)   
  15.             *pdwLen=0;   
  16.         http.Release();   
  17.         CoUninitialize();   
  18.         return NULL;   
  19.     }   
  20.     http->setRequestHeader(L"Referer","");   
  21.     http->setRequestHeader(L"Accept-Language","zh-cn");   
  22.     http->setRequestHeader(L"Content-Type","application/x-www-form-urlencoded");   
  23.     hr=http->send();   
  24.     if (hr!=0)   
  25.     {   
  26.         if (pdwLen!=NULL)   
  27.             *pdwLen=0;   
  28.         http.Release();   
  29.         CoUninitialize();   
  30.         return NULL;   
  31.     }   
  32.     _variant_t   vbin   =   http-> responseBody;   
  33.     char   *   pBuf2=NULL;   
  34.     SafeArrayAccessData(vbin.parray,(void   **)&pBuf2);   
  35.     if (pBuf2==NULL)   
  36.     {   
  37.         if (pdwLen!=NULL)   
  38.             *pdwLen=0;   
  39.         SafeArrayUnaccessData(vbin.parray);   
  40.         http.Release();   
  41.         CoUninitialize();   
  42.         return NULL;   
  43.     }   
  44.     long   size=vbin.parray-> rgsabound[0].cElements;   
  45.     byte *bRet=(byte*)malloc(size+1);   
  46.     bRet[size]=0;   
  47.     memcpy(bRet,pBuf2,size);   
  48.     SafeArrayUnaccessData(vbin.parray);        
  49.     http.Release();   
  50.     CoUninitialize();   
  51.     if (pdwLen!=NULL)   
  52.         *pdwLen=size;   
  53.     return bRet;//外部自己必须 Free;   
  54. }  
复制代码

  1. //下面这个协议头貌似很好用   
  2.     http->setRequestHeader(L"Connection",L"keep-alive");   
  3.     http->setRequestHeader(L"Accept",L"application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5");   
  4.     http->setRequestHeader(L"User-Agent",L"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.224 Safari/534.10");   
  5. //  http->setRequestHeader(L"Accept-Encoding",L"gzip,deflate,sdch");   
  6.     http->setRequestHeader(L"Accept-Language",L"zh-CN,zh;q=0.8");  
复制代码
【VB】QQ群:1422505加的请打上VB好友
【易语言】QQ群:9531809  或 177048
【FOXPRO】QQ群:6580324  或 33659603
【C/C++/VC】QQ群:3777552
【NiceBasic】QQ群:3703755
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表