|
到处扯 终于扯到 vs 能用的 com对象调用方式了
相信有不少人在找vs c++ 调用 com对象的方法
参考 http://topic.csdn.net/u/20070315 ... e-a78ad69b0796.html
写的非常乱 也不知道有没有资源泄露- #include <Windows.h>
- #include <atlstr.h> //可以用 cstring了
- #include <stdio.h>
- #import <msxml3.dll>
- using namespace MSXML2;
- byte * XmlHttp(LPSTR szHttpAddr) //返回 byte* 必须 delete[]
- {
- CoInitialize(0);
- IXMLHTTPRequestPtr http=NULL;//(__uuidof(XMLHTTP));
- http.CreateInstance("Msxml2.XMLHTTP");
- http->open("GET", szHttpAddr, false);
- http->setRequestHeader("Referer","");
- http->setRequestHeader("Accept-Language","zh-cn");
- http->setRequestHeader("Content-Type","application/x-www-form-urlencoded");
- http->send();
- _variant_t vbin = http-> responseBody;
- char * pBuf2=NULL;
- byte *bRet=NULL;
- if (vbin.vt==(VT_ARRAY|VT_UI1))
- {
- SafeArrayAccessData(vbin.parray,(void **)&pBuf2);
- long size=vbin.parray-> rgsabound[0].cElements;
- // raw bytes stream utf-8 to uniocde ,1 get size
- int nwLen = MultiByteToWideChar(CP_ACP,0,pBuf2,-1,NULL,0);
- printf( "UTF8 String len:%d\n ",nwLen);
- LPWSTR lpw=new WCHAR[nwLen];
- memset (lpw,0,(nwLen)*sizeof(WCHAR)); //make the buffer empty, use <memory.h>
- printf( "bytes:%d\n ",(nwLen)*sizeof(WCHAR));
- // utf-8 to uniocde ,2 convert
- MultiByteToWideChar( CP_ACP, 0,pBuf2, size, lpw, nwLen );
- BYTE *result=new BYTE[(nwLen)*sizeof(WCHAR)];
- memset(result,0,(nwLen)*sizeof(WCHAR));
- // unicode to LPSTR
- WideCharToMultiByte( CP_ACP, 0,lpw, -1,(LPSTR)result, (nwLen)*sizeof(WCHAR), NULL, NULL );
- printf( "ANSI String[%d]=%s\n ",_tcslen((LPCTSTR)result),result);
- _bstr_t bstring((LPCTSTR)result);
- delete[] lpw;
- delete[] result;
- SafeArrayUnaccessData(vbin.parray);
- bRet=(byte*)lpw;
- MessageBox(NULL, (LPCTSTR)bstring, _T( "Results "), MB_OK);
- }
-
- http.Release();
- CoUninitialize();
- return bRet;
- }
- int main()
- {
- system("pause");
- XmlHttp("http://www.17u2.com");
- system("pause");
- return 0;
- }
复制代码 下面是我自己写的简化版 不知道我写的是否有什么隐性问题 不过看起来应该足够用了- #import <msxml3.dll>
- byte * XmlHttp(LPWSTR szHttpAddr,PDWORD pdwLen=0); //返回 byte* 必须 外部 free()
- byte * XmlHttp(LPWSTR szHttpAddr,PDWORD pdwLen) //返回 byte* 必须 外部 free()
- {
- CoInitialize(0);
- MSXML2::IXMLHTTPRequestPtr http=NULL;//(__uuidof(XMLHTTP));
- HRESULT hr;
- hr=http.CreateInstance(L"Msxml2.XMLHTTP");
- if (hr!=0)
- return NULL;
- hr=http->open(L"GET", szHttpAddr, false);
- if (hr!=0)
- {
- if (pdwLen!=NULL)
- *pdwLen=0;
- http.Release();
- CoUninitialize();
- return NULL;
- }
- http->setRequestHeader(L"Referer","");
- http->setRequestHeader(L"Accept-Language","zh-cn");
- http->setRequestHeader(L"Content-Type","application/x-www-form-urlencoded");
- hr=http->send();
- if (hr!=0)
- {
- if (pdwLen!=NULL)
- *pdwLen=0;
- http.Release();
- CoUninitialize();
- return NULL;
- }
- _variant_t vbin = http-> responseBody;
- char * pBuf2=NULL;
- SafeArrayAccessData(vbin.parray,(void **)&pBuf2);
- if (pBuf2==NULL)
- {
- if (pdwLen!=NULL)
- *pdwLen=0;
- SafeArrayUnaccessData(vbin.parray);
- http.Release();
- CoUninitialize();
- return NULL;
- }
- long size=vbin.parray-> rgsabound[0].cElements;
- byte *bRet=(byte*)malloc(size+1);
- bRet[size]=0;
- memcpy(bRet,pBuf2,size);
- SafeArrayUnaccessData(vbin.parray);
- http.Release();
- CoUninitialize();
- if (pdwLen!=NULL)
- *pdwLen=size;
- return bRet;//外部自己必须 Free;
- }
复制代码
- //下面这个协议头貌似很好用
- http->setRequestHeader(L"Connection",L"keep-alive");
- 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");
- 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");
- // http->setRequestHeader(L"Accept-Encoding",L"gzip,deflate,sdch");
- http->setRequestHeader(L"Accept-Language",L"zh-CN,zh;q=0.8");
复制代码 |
|