zoukankan      html  css  js  c++  java
  • IWinHttpRequest Create COM

    方法一:

    1、新建MFC工程时要选上使用套接字连接。

    2、MFC工程中》类向导》右上角“添加类”下的“类型库中的MFC类”,如果注册表列表下没有winhttp控件,那就选择从文件位置指定添加,路径一般在c:windowssystem32winhttp.dll,如果是64位的系统,建议用路径c:windowsSysWOW64winhttp.dll下的winhttp.dll控件

    复制代码
     1 void CWinHttpDemoDlg::OnBnClickedBtnGo()
     2 {
     3     //初始化com组件
     4     CoInitialize(nullptr);
     5     //开始使用com组件中的方法
     6     CWinHttpRequest* pHttpRep = new CWinHttpRequest();
     7 
     8     pHttpRep->CreateDispatch(_T("WinHttp.WinHttpRequest.5.1"));
     9     
    10     //打开网站
    11     COleVariant varFalse = VARIANT_FALSE;
    12     //将URL抓换为ip地址、检查url的参数是否正确、新建好get请求指令、
    13     pHttpRep->Open(_T("GET"), _T("http://www.baidu.com"), varFalse);
    14     //socket、连接、发送、接收
    15     pHttpRep->Send(vtMissing);
    16 
    17     //接收服务器返回的数据
    18     CString strBuf = pHttpRep->get_ResponseText();
    19     MessageBox(strBuf);
    20 
    21     delete pHttpRep;
    22     CoUninitialize();
    23 }
    复制代码

    方法二:

    用打包的方式,就不需要在类向导添加控件。  使用 

     #import "C:\Windows\SysWOW64\winhttp.dll"后,会在源码目录生成一个2个 关于winhttp的文件,里面会有一个命名空间:namespace WinHttp;  //这里引用的DLL生成到源码目录下里面的命名名字

    这里可以直接在开发源码里面加入

    #import "c:\windows\system32\WinHttp.dll"
    using namespace WinHttp; //这里引用的DLL生成到源码目录下里面的命名名字

    即可正常 CoCreateInstance相关COM



    复制代码
     1 //方式2,打包dll方式
     2 #import "C:\Windows\SysWOW64\winhttp.dll" no_namespace//没有no_namespace的话后面使用IWinHttpRequest前面要加作用域名,在debug目录下可以看对应生成的名称,com组件常遇到的问题
     3 void CWinHttpDemoDlg::OnBnClickedBtnGo()
     4 {
     5     CoInitialize(nullptr);
     6 
     7     IWinHttpRequest *pHttp = nullptr;
     8     //com组件其实就是windows的组成部分
     9     CoCreateInstance(__uuidof(WinHttpRequest), nullptr, CLSCTX_ALL, __uuidof(IWinHttpRequest), (LPVOID*)&pHttp);
    10 
    11     pHttp->Open(_T("GET"), _T("http://www.baidu.com"));
    12     pHttp->Send();
    13 
    14     CString strBuf = pHttp->ResponseText;
    15     MessageBox(strBuf);
    16 
    17     pHttp->Release();
    18     CoUninitialize();
    19 }
    复制代码

    方法三:智能指针的方式

    复制代码
     1 #import "C:\Windows\SysWOW64\winhttp.dll" no_namespace//没有no_namespace的话后面使用IWinHttpRequest前面要加作用域名,在debug目录下可以看对应生成的名称,com组件常遇到的问题
     2 void CWinHttpDemoDlg::OnBnClickedBtnGo()
     3 {
     4     IWinHttpRequestPtr ptrHttpReq;
     5     ptrHttpReq.CreateInstance(__uuidof(WinHttpRequest));
     6     ptrHttpReq->Open(_T("GET"), _T("http://www.baidu.com"));
     7     ptrHttpReq->Send();
     8     CString strBuf = ptrHttpReq->ResponseText;
     9     MessageBox(strBuf);
    10 }
    复制代码

    -----------------------

    方式三的POST情况:

    复制代码
     1 //方式3,智能指针(就是后面带Ptr)
     2 #import "C:\Windows\SysWOW64\winhttp.dll" no_namespace//没有no_namespace的话后面使用IWinHttpRequest前面要加作用域名,在debug目录下可以看对应生成的名称,com组件常遇到的问题
     3 void CWinHttpDemoDlg::OnBnClickedBtnGo()
     4 {
     5     IWinHttpRequestPtr ptrHttpReq;
     6     ptrHttpReq.CreateInstance(__uuidof(WinHttpRequest));
     7     ptrHttpReq->Open(_T("POST"), _T("http://www.txtpw.com/hui_mima.asp"));
     8     CString strBody = _T("bh:85141
    mm:mark123
    imageField.y:14");
     9     COleVariant varBody = strBody;
    10     ptrHttpReq->Send(varBody);
    11     //CString strBuf = ptrHttpReq->ResponseText;//直接获取中文会乱码
    12     _variant_t varReqBody = ptrHttpReq->ResponseBody;
    13     size_t len = varReqBody.parray->rgsabound[0].cElements;
    14     char* pBuf = (char*)(varReqBody.parray->pvData);
    15     //MessageBox(strBuf);
    16 }
     
     
     
     

    mfc项目的字符集为unicode字符集

    乱码前代码:

    CString rspStr = pHttpReq->ResponseText;
    MessageBox(rspStr);

    乱码效果:

     

    解决方法: 

     _variant_t varRspBody = pHttpReq->GetResponseBody();
     //ULONG dataLen = varRspBody.parray->rgsabound[0].cElements; // 文本长度
     char *pContentBuffer = (char*)varRspBody.parray->pvData;
     CString rspStr;
     rspStr = pContentBuffer;
        
     
     
     
     
     

    //获取响应信息

    _bstr_t varRspBody2 = REhttp->GetAllResponseHeaders();
    CString AllResponseHeaders2 = CString((LPCTSTR)varRspBody2);

  • 相关阅读:
    Welcome to my website
    花生壳
    Gentle.NET Attribute
    发布WebFtp 控件(ASP.NET控件,用以web方式进行文件上下传操作)
    发布数据库连接字符串生成工具
    发布语法加亮控件(SyntaxTextBox)
    .NET中现有的 ORM 工具(转)
    发布Oracle存储过程包c#代码生成工具(CodeRobot)
    ASCII码表
    爱上语法高亮控件ICSharpCode.TextEditor ~o~
  • 原文地址:https://www.cnblogs.com/ruingking/p/13179778.html
Copyright © 2011-2022 走看看