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