IWinHttpRequest Create COM
2021-01-05 21:29
方法一:
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);
上一篇:WPF的MVVM模式
文章标题:IWinHttpRequest Create COM
文章链接:http://soscw.com/index.php/essay/40355.html