您当前的位置: 首页 >  http

暂无认证

  • 0浏览

    0关注

    101061博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

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

发布时间:2012-08-16 17:39:00 ,浏览量:0

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

飘飘白云2007/11/8

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

具体实现是通过获取浏览器的IWebBrowser2指针,用该接口的Navigate2方法来实现,Navigate2在MSDN描述如下, HRESULTNavigate2( 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);

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型的数据,所以要设置 VARIANT的lVal作为值。如代码中的:

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

关注
打赏
1655516835
查看更多评论
立即登录/注册

微信扫码登录

0.0501s