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);

原文地址:https://www.cnblogs.com/ruingking/p/13179778.html