利用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值