wanlifeipeng

  博客园 :: 首页 :: 博问 :: 闪存 :: :: 联系 :: 订阅 订阅 :: 管理 ::

1.使用IWinHttpRequest获取网页源码

首先要创建基于对话框的mfc应用程序

 

2.import+接口方式

首先导入winhttp.dll,使用IWinHttpRequest接口

#import "C:\\Windows\\System32\\winhttp.dll"

void CHttpTestDlg::OnBnClickedButton1()
{
    ::CoInitialize(NULL); // 初始化com组件
    IWinHttpRequest *pHttpReq = NULL;

}

 编译会出现如下错误:

在项目的Debug目录下,生成两个文件:winhttp.tlh和winhttp.tli

查看winhttp.tlh

解决方法:

1)使用命名空间WinHttp

,

2)在导入动态库的时候不要引入命名空间

代码:

#import "C:\\Windows\\System32\\winhttp.dll" no_namespace

// IID for IWinHttpRequest
const IID IID_IWinHttpRequest = 
{
    0x06f29373,
    0x5c5a,
    0x4b54,
    { 0xb0, 0x25, 0x6e, 0xf1, 0xbf, 0x8a, 0xbf, 0x0e }
};

void CHttpTestDlg::OnBnClickedButton1()
{
    HRESULT hr = NULL;
    hr = CoInitialize(NULL);
    IWinHttpRequest *pHttpReq = NULL;
     
    CLSID clsid;
    hr = CLSIDFromProgID(_T("WinHttp.WinHttpRequest.5.1"), &clsid);
    IID iid = __uuidof(IWinHttpRequest); 
    CLSID tclsid = __uuidof(WinHttpRequest);
        hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, IID_IWinHttpRequest, (LPVOID*)&pHttpReq);
    //hr = CoCreateInstance(__uuidof(WinHttpRequest), NULL, CLSCTX_INPROC_SERVER, __uuidof(IWinHttpRequest), (LPVOID*)&pHttpReq);

    if (FAILED(hr))
    {
        CoUninitialize();
        return;
    }

    hr = pHttpReq->Open(_T("GET"), _T("http://www.baidu.com")); //缺省值为vtMissing
    if (FAILED(hr))
    {
        pHttpReq->Release();
        CoUninitialize();
        return;
    }
        

    hr = pHttpReq->Send(); // 缺省值为vtMissing
    if (FAILED(hr))
    {
        pHttpReq->Release();
        CoUninitialize();
        return;
    }
    
    CString respStr = pHttpReq->ResponseText;
    MessageBox(respStr); 

    pHttpReq->Release();
    CoUninitialize();
} 

备注:

1、只要是已经注册了的组件就可以在注册表中查到其GUID,比如我现在查询下IWinHttpRequest接口的IID,用RegWorkshop这个工具就能快速搜索到。

2、这么多的ID确实不好记,简便方法就是使用__uuidof()

__uuidof 关键字用来获得表达式的GUID。这个表达式可以是一种类型名称、一个指针、引用或者一个类型的数组、一个有这个类型实例化的模板或者这种类型的变量。

只要编译器能使用该参数获得相关的GUID,那么该参数就是有效的。这个参数的特殊情况就是它取0或NULL的时候。在这种情况下,__uuidof会返回一个由0组成的GUID

 

OLE/COM软件的使用:

下载OleViewer(我使用的是v10.0)

右击oleview.exe,以管理员身份运行

选择菜单"File"->"View typelib" , 打开对应的文件

 

 

 

使用RegWorkshop获取已注册com组件的GUID:

以IWinHttpRequest,打开RegWorkShop,搜索IWinHttpRequest

 打开对应的注册表:

 

调试结果:

 

posted on 2017-05-22 12:06  wanlifeipeng  阅读(1160)  评论(0编辑  收藏  举报