IWinHttpRequest Create COM

方法一:

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

2、MFC工程中》类向导》右上角“添加类”下的“类型库中的MFC类”,如果注册表列表下没有winhttp控件,那就选择从文件位置指定添加,路径一般在c:\windows\system32\winhttp.dll,如果是64位的系统,建议用路径c:\windows\SysWOW64\winhttp.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\r\nmm:mark123\r\nimageField.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);

相关文章