zoukankan      html  css  js  c++  java
  • 利用IWebBrowser2接口的Navigate2方法实现Http POST传输

    开发中的社区游戏,要求将原来的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
    
  • 相关阅读:
    使用CSVDE批量导入命令/出口AD用户
    Everything You Wanted to Know About Machine Learning
    android Vibrator 用法
    oc-25- @property @synthesize
    oc-24-点语法
    oc-23-static
    oc-22-sel
    oc-21-class对象
    oc-20-多态
    oc-19-成员变量修饰符
  • 原文地址:https://www.cnblogs.com/zdxster/p/1945891.html
Copyright © 2011-2022 走看看