利用IWebBrowser2接口的Navigate2方法实现Http POST传输

来源:互联网 发布:上海软件协会网站 编辑:程序博客网 时间:2024/05/01 03:00
利用IWebBrowser2接口的Navigate2方法实现Http POST传输

    飘飘白云2007/11/8

 

开发中的社区游戏,要求将原来的mini浏览器扩展成可以通过Http POST传输来打开网页,比如:通过提交用户idpassword,用户的action(查看profile,查看日记,打开blog等等),从而在mini浏览器里打开相应的网页。

具体实现是通过获取浏览器的IWebBrowser2指针,用该接口的Navigate2方法来实现,Navigate2MSDN描述如下,

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

 

........//其他代码

 

       //Get size of Post Data

       int size = WideCharToMultiByte(CP_ACP, 0,postData, -1, 0, 0, 0, 0);

 

       VARIANTvURL;

       VARIANTvFlags;

       VARIANTvPostData;

       VARIANTvHeaders;

       VARIANTvNull;

 

       // Init

       VariantInit(&vURL);

       VariantInit(&vFlags);

       VariantInit(&vPostData);

       VariantInit(&vHeaders);

       VariantInit(&vNull);

 

       // Set value

       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 = newchar[size + 1];

           WideCharToMultiByte(CP_ACP, 0,postData, -1, pPostData,size, 0, 0);

 

           SAFEARRAYFAR*    sfPost =NULL;

           SAFEARRAYBOUNDbound;

           bound.cElements = (ULONG) (strlen(pPostData));

           bound.lLbound = 0;

           sfPost =SafeArrayCreate(VT_UI1, 1, &bound);

 

           char* pChar = pPostData;

           for (longlIndex = 0; lIndex < (signed)bound.cElements;lIndex++) {

              SafeArrayPutElement(sfPost, &lIndex, (void*)((pChar++)));

           }

 

           vPostData.vt =VT_ARRAY | VT_UI1;

           vPostData.parray =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型的数据,所以要设置VARIANTlVal作为值。如代码中的:

       vFlags.vt =VT_I4;

       vFlags.lVal =navNoReadFromCache | navNoWriteToCache;

 

第二,   如果要实现POST数据提交,不能将Navigate2方法中不需要的参数简单地设置成NULL,必须创建一个VARIANT变量vNull,并对它进行初始化。比如:

       VariantInit(&vNull);

       vNull.vt =VT_BSTR;

       vNull.bstrVal =NULL;

       ……

iBrowser->Navigate2(&vURL, &vFlags, &vNull, &vPostData, &vHeaders);

 

第三,   vPostData的变量类型是VT_ARRAY |VT_UI1,其数据是一个SAFEARRAY型的字符数组,具体赋值请参看代码。

 

原创粉丝点击