利用IWebBrowser2接口的Navigate2方法实现Http POST传输
来源:互联网 发布:上海软件协会网站 编辑:程序博客网 时间:2024/05/01 03:00
飘飘白云2007/11/8
开发中的社区游戏,要求将原来的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
........//其他代码
//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型的数据,所以要设置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型的字符数组,具体赋值请参看代码。
- 利用IWebBrowser2接口的Navigate2方法实现Http POST传输
- 利用IWebBrowser2接口的Navigate2方法实现Http POST传输
- 利用IWebBrowser2接口的Navigate2方法实现Http POST传输
- 有关于微软的IWebBrowser2::Navigate2/Navigate方法
- 有关于微软的IWebBrowser2::Navigate2/Navigate方法收藏
- IWebBrowser2的Get及Post方法
- http post请求接口 传输json
- 通过IWebBrowser2的Navigate2来打开网页,怎样判断网页是否全部加载完毕
- 通过IWebBrowser2的Navigate2来打开网页,怎样判断网页是否全部加载完毕
- 实现HTTP-POST的Edit Action方法
- HTTP中POST方法的实现
- CURL实现HTTP的GET POST方法
- http的get、post请求实现方法
- 利用IWebBrowser2的IWebBrowser2::get_Document得doc对象
- HTTP详解(五):HTTP POST方法传输多种类型的数据
- Android学习笔记---28_网络通信之通过HTTP协议实现文件上传,组拼http 的post方法,传输内容
- 【python】利用http的POST请求实现自动翻译机
- http的post方法
- CString、BSTR和LPCTSTR之间的区别
- C语言中char int转换问题
- transaction already active
- 转载:中国惠普前总裁孙振耀谈工作与生活
- shell 命令小计——工作笔记
- 利用IWebBrowser2接口的Navigate2方法实现Http POST传输
- adb log 分析
- java.lang.Thread.State类详解
- Android 快捷方式
- 正则验证
- scala
- Extjs 自定义函数,外部调用
- 网络爬虫中高效率的URL索引 更新支持千万条数据
- 解决 Jquery 弹出层 获取不到值(iframe)相关