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

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

 

       //飘飘白云([email protected])  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);

 

       VARIANT vURL;

       VARIANT vFlags;

       VARIANT vPostData;

       VARIANT vHeaders;

       VARIANT vNull;

 

       // 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 = 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;

           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型的字符数组,具体赋值请参看代码。

 

你可能感兴趣的:(UI,浏览器,null,url,delete,action)