POST教程笔记 - WinHttp获取网页源码

①、WinINet与WinHttp的异同点,为什么使用WinHttp讲解?

详情见:《WinINet与WinHttp总结》文档,已经打包给大家了。

②、WinHttp接口调用方式:
微软官方地址:http://msdn.microsoft.com/en-us/ ... 84263(v=vs.85).aspx
WinHttp微软提供了两种调用方式:C++调用API的版本、COM组件的版本。这里面使用的是 C++ Interface 接口的组件的方式来给大家讲解。

③、WinHttp常用命令讲解:
详情见:http://msdn.microsoft.com/en-us/ ... 84263(v=vs.85).aspx

/*

①、获取网页源码的步骤:
1、COM组件初始化;
2、定义WinHttp对象指针;
3、创建并实例化WinHttp组件;

4、调用Open方法打开连接;
5、调用Send方法发送请求;
6、获取ResponseText返回的文本;

7、释放WinHttp组件对象;
8、释放WinHttp对象指针;
9、卸载COM组件;

*/
/*

②、使用WinHttp3种方法的优缺点
1、类型库生成包装类的方式:优点->使用方便,贴近C++,缺点->COM接口的默认缺省参数必须填写,不灵活;
2、import+接口方式:优点->COM接口的申请与释放自己控制,很灵活,缺点->控制不好,引起内存泄露,且COM组件的实例化参数较多;
3、import+智能指针包装类的方式:优点->智能指针,使用方便,不用担心内存泄露,COM组件实例化简单,可使用COM组件的默认缺省参数;

*/

下面给出三种方法的使用示例:

方法1:

// 方法1 类型库生成包装类的方式:优点->使用方便,贴近C++,缺点->COM接口的默认缺省参数必须填写,不灵活;
void CHttpTestDlg::OnBnClickedButton1()
{
    CoInitialize(NULL);
    CWinHttpRequest* pWinHttp = new CWinHttpRequest;
    BOOL bRet = pWinHttp->CreateDispatch(L"WinHttp.WinHttpRequest.5.1");
    if (!bRet)  return;

//    CLSID clsid = { 0 };
//    CLSIDFromProgID(L"WinHttp.WinHttpRequest.5.1", &clsid);
//    pWinHttp->CreateDispatch(clsid);

    COleVariant async = VARIANT_FALSE;
    pWinHttp->Open(L"GET", L"http://www.baidu.com", async);
    pWinHttp->Send(vtMissing);
    CString strSrc = pWinHttp->get_ResponseText();
    MessageBox(strSrc);

    pWinHttp->ReleaseDispatch();

    delete pWinHttp;
    CoUninitialize();
}

// 以上,CWinHttpRequest是类型库生成包装类


方法2:

#import "C:\\windows\\SysWOW64\\winhttp.dll" no_namespace
// 方法2
void CHttpTestDlg::OnBnClickedButton2()
{
    BSTR bstrBody;
    CString strBody;

    CoInitialize(NULL);

    IWinHttpRequest* pHttpReq = NULL;
    HRESULT hr =     CoCreateInstance(
        __uuidof(WinHttpRequest),
        nullptr,
        CLSCTX_ALL,
        __uuidof(IWinHttpRequest),
        (PVOID*)&pHttpReq
        );
    if (FAILED(hr)){
        goto _exit0;
    }

    hr = pHttpReq->Open(L"GET", L"http://www.baidu.com");
    if (FAILED(hr)){
        goto _exit1;
    }

    hr = pHttpReq->Send();
    if (FAILED(hr)) {
        goto _exit1;
    }

    hr = pHttpReq->get_ResponseText(&bstrBody); // <=> _bstr_t bStrRsp = pHttpReq->ResponseText;
    if (FAILED(hr)) {
        goto _exit1;
    }

    strBody = bstrBody;
    MessageBox(strBody);

_exit1:
    pHttpReq->Release();

_exit0:
    CoUninitialize();
}

方法3:

#import "C:\\windows\\SysWOW64\\winhttp.dll" no_namespace
// 方法3
void CHttpTestDlg::OnBnClickedButton3()
{
    BSTR bstrBody;
    CString strBody;

    CoInitialize(NULL);
    IWinHttpRequestPtr pHttpReq = NULL;
    HRESULT hr = pHttpReq.CreateInstance(__uuidof(WinHttpRequest));
    if (FAILED(hr)){
        goto _exit0;
    }

    hr = pHttpReq->Open(L"GET", L"http://www.baidu.com");
    if (FAILED(hr)) {
        goto _exit0;
    }

    hr = pHttpReq->Send();
    if (FAILED(hr)) {
        goto _exit0;
    }

    pHttpReq->get_ResponseText(&bstrBody);
    strBody = bstrBody;
    MessageBox(strBody);

_exit0:
    CoUninitialize();
}
时间: 2024-10-23 10:58:55

POST教程笔记 - WinHttp获取网页源码的相关文章

Delphi XE下获取网页源码记录

存放个自己写的获取网页源码,掌握了: 1.利用CreateOLEObject方式获取源码 2.自动判断网页格式编码 需要使用到的单元:Winapi.ActiveX,System.Win.ComObj,System.WideStrUtils 需要创建结构体:TResultWebHtml (用于存放返回的源码和Cookies) Uses Winapi.ActiveX,System.Win.ComObj,System.WideStrUtils; type TResultWebHtml = record

vc++获取网页源码

使用IWinHttpRequest获取网页源码 首先要创建基于对话框的mfc应用程序, 2.import+接口方式 首先导入winhttp.dll,使用IWinHttpRequest接口 #import "C:\\Windows\\System32\\winhttp.dll" void CHttpTestDlg::OnBnClickedButton1() { ::CoInitialize(NULL); // 初始化com组件 IWinHttpRequest *pHttpReq = NU

IXMLHTTPRequest获取网页源码的心得

在万一老师的博客看到一种利用IXMLHTTPRequest来获取网页源码的方法,但有2个问题没解决,自己研究了下改进了方法. 1.如果网页进行301转跳将无法获取源码 2.如果网站是gb2312编码将获取的是乱码 /////以下方法使用的是Delphi xe2编写 uses MsXML,activex; function GETHTML (const URL : string):string; // XMLHTTP接口Var XMLHTTP:IServerXMLHTTPRequest; HTML

Python爬虫学习之获取网页源码

偶然的机会,在知乎上看到一个有关爬虫的话题<利用爬虫技术能做到哪些很酷很有趣很有用的事情?>,因为强烈的好奇心和觉得会写爬虫是一件高大上的事情,所以就对爬虫产生了兴趣. 关于网络爬虫的定义就不多说了,不知道的请自行点击查看 =>百度百科 网络爬虫,维基百科 网络爬虫 有很多编程语言都可以编写网络爬虫,只不过各有各的优缺点,这里我选择用Python语言编写爬虫,因为Python是一门非常适合用来编写爬虫的语言,用它实现爬虫的代码量相对其他语言要少很多,并且python语言对网络编程这类模块

C++ 获取网页源码码的操作

#include <stdio.h>#include <windows.h>#include <wininet.h>#pragma comment(lib,"Wininet.lib")#include <vector>using namespace std;int _tmain(int argc, _TCHAR* argv[]){ vector<TCHAR> v; TCHAR szUrl[] = _T("http:/

asp.net C# 获取网页源码的几种方式

1 方法 System.Net.WebClient aWebClient = new System.Net.WebClient(); aWebClient.Encoding = System.Text.Encoding.Default; Byte[] pageData = aWebClient.DownloadData(url); string nhtml = Encoding.GetEncoding("utf-8").GetString(pageData); 2方法 System.N

delphi webbrowser 获取网页源码

转自 http://hi.baidu.com/delphidiary 转自 http://blog.sina.com.cn/s/blog_725fb194010150jh.html //前面要加几个pas单元uses Registry,ShellApi, WinInet,ShlObj,ComObj;//========================================删COOKIES========================== procedure DelRegCache;

按键精灵 vbs 获取网页源码 xp系统被拒绝

如下面的代码所示,获取新浪博客某个指定网页的源码 verurl = "http://blog.sina.com.cn/s/blog_9ea1db7b0101o7ch.html?" & now() Set Http = CreateObject("Microsoft.XMLHTTP") Http.open "get", verurl, False Http.send Delay 50 vbody = Http.responsebody Tr

Android(java)学习笔记203:网页源码查看器

1.项目框架图: 2.首先是布局文件activity_main.xml: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="m