利用IWebBrowser2接口的Navigate2方法实现Http POST传输
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | 开发中的社区游戏,要求将原来的mini浏览器扩展成可以通过Http POST传输来打开网页,比如:通过提交用户id,password,用户的action(查看profile,查看日记,打开blog等等),从而在mini浏览器里打开相应的网页。具体实现是通过获取浏览器的IWebBrowser2指针,用该接口的Navigate2方法来实现,Navigate2在MSDN描述如下, HRESULT Navigate2( VARIANT *URL, VARIANT *Flags, VARIANT *TargetFrameName, VARIANT *PostData, VARIANT *Headers ); 具体参数细节请参看MSDN文档。比较麻烦的是这个函数的参数设置,后面作详细说明,先看代码。这里有如下假定 iBrowser是一个有效的IWebBrowser2指针, url为有效的地址(如:L "http://172.24.1.241/profile/" ), postData为需要提交的数据( 如:L "userid=kesalin&password=pwd&action=profile" ) //飘飘白云(l_zhaohui@163.com)2007/11/8 IWebBrowser2* iBrowser; LPCTSTR url; LPCTSTR postData; // .......other codes. //Get size of Post Data int size = WideCharToMultiByte(CP_ACP, 0, postData, -1, 0, 0, 0, 0); VARIANT vURL; VARIANT vFlags; VARIANT vPostData; VARIANT vHeaders; VARIANT vNull; // Init VariantInit(&vURL); VariantInit(&vFlags); VariantInit(&vPostData); VariantInit(&vHeaders); VariantInit(&vNull); // Set value vNull.vt = VT_BSTR; vNull.bstrVal = NULL; vHeaders.vt = VT_BSTR; vHeaders.bstrVal = SysAllocString(L "Content-Type: application/x-www-form-urlencoded\r\n" ); vFlags.vt = VT_I4; vFlags.lVal = navNoReadFromCache | navNoWriteToCache; vURL.vt = VT_BSTR; vURL.bstrVal = SysAllocString(url); if (size > 1) { // POST char * pPostData = new char [size + 1]; WideCharToMultiByte(CP_ACP, 0, postData, -1, pPostData, size, 0, 0); SAFEARRAY FAR* sfPost = NULL; SAFEARRAYBOUND bound; bound.cElements = ( ULONG ) ( strlen (pPostData)); bound.lLbound = 0; sfPost = SafeArrayCreate(VT_UI1, 1, &bound); char * pChar = pPostData; for ( long lIndex = 0; lIndex < ( signed )bound.cElements; lIndex++) { SafeArrayPutElement(sfPost, &lIndex, ( void *)((pChar++))); } vPostData.vt = VT_ARRAY | VT_UI1; vPostData.parray = sfPost; SafeArrayDestroy(sfPost); delete [] pPostData; pPostData = NULL; pChar = NULL; iBrowser->Navigate2(&vURL, &vFlags, &vNull, &vPostData, &vHeaders); } else { // GET iBrowser->Navigate2(&vURL, &vNull, &vNull, &vNull, &vNull); } // Clear VariantClear(&vURL); VariantClear(&vFlags); VariantClear(&vPostData); VariantClear(&vHeaders); VariantClear(&vNull); 有三点值得说明:第一, 数据类型 VT_I4 是指示一个 long 型的数据,所以要设置 VARIANT的lVal作为值。如代码中的: vFlags.vt = VT_I4; vFlags.lVal = navNoReadFromCache | navNoWriteToCache; 第二, 如果要实现POST数据提交,不能将Navigate2方法中不需要的参数简单地设置成NULL,必须创建一个VARIANT变量vNull,并对它进行初始化。比如: VariantInit(&vNull); 第三, vPostData的变量类型是VT_ARRAY | VT_UI1,其数据是一个SAFEARRAY型的字符数组,具体赋值请参看代码。 // Set value vNull.vt = VT_BSTR; vNull.bstrVal = NULL; iBrowser->Navigate2(&vURL, &vFlags, &vNull, &vPostData, &vHeaders); 本文来自CSDN博客,转载请标明出处:http: //blog.csdn.net/kesalin/archive/2007/11/11/1878959.aspx |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)