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

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

时间: 2024-08-03 04:00:25

利用IWebBrowser2接口的Navigate2方法实现Http POST传输的相关文章

利用PAPI接口监测Java程序的硬件执行特征

简介:PAPI 是一组用于访问处理器硬件性能计数器的本地接口,利用这一接口对 Java 程序的硬件执 行特征进行监测将有助于在计算机系统的硬件层上发现程序性能问题的根源所在.本文介绍了 PAPI 的重 要概念及其常用接口,分析了将其应用于 Java 程序性能测评的要点和难点,提出一种基于 JVMTI 接口 的方法实现了利用 PAPI 接口监测 Java 程序的运行时硬件执行特征. PAPI 接口概览 在计算机系统的硬件层对 Java 程序的性能进行测评与分析,有助于发现程序 性能问题的根源所在.

利用runnable接口的父类被继承,子类运行后会产生几个线程

问题描述 利用runnable接口的父类被继承,子类运行后会产生几个线程 父类使用了runnable接口,子类继承父类,那么调用子类的start()方法后,会产生几个线程? //父类 public class father implements Runnable { public void run() {} } //子类 public class son { public void run() {super.run();} } 大概的意思就是像代码那样,不知道会创建多少个线程,怎么查看线程数目呢

函数式接口、默认方法、纯函数、函数的副作用、高阶函数、可变的和不可变的、函数式编程和 Lambda 表达式 - 响应式编程 [Android RxJava2](这到底是什么)第三部分

本文讲的是函数式接口.默认方法.纯函数.函数的副作用.高阶函数.可变的和不可变的.函数式编程和 Lambda 表达式 - 响应式编程 [Android RxJava2](这到底是什么)第三部分, 太棒了,我们又来到新的一天.这一次,我们要学一些新的东西让今天变得有意思起来. 大家好,希望你们都过得不错.这是我们的 RxJava2 Android 系列的第三篇文章. 第一部分 第二部分 在这篇文章中,我们将讨论函数式的接口,函数式编程,Lambda 表达式以及与 Java 8 的相关的其它内容.这

匿名对象-java中接口,匿名类,实现这个接口类的方法

问题描述 java中接口,匿名类,实现这个接口类的方法 不能直接new一个接口,但是接口再被实现后,再new这个接口,并写上实现这个接口的方法,那么new的这个接口如果没有赋值引用,那么new的这个接口就是一个匿名类,这么理解对不 解决方案 没有名字的类就是匿名类,没有名字的对象就是匿名对象. 判断标准,你能不能说出类的名字.说不出肯定是匿名类. 解决方案二: 你看下这个文章 应该能理解了匿名类直接new接口 解决方案三: 利用匿名内部类实现Java接口方法java实现接口类Java面向对象 匿

请问这个接口是如何直接调用接口中的方法的?没有找到将接口实现为类实例的代码

问题描述 有一个PieChartDataProvider接口,定义如下publicinterfacePieChartDataProvider{publicPieChartDatagetPieChartData();.......}有一个实现这个接口的类PieChartView,里面覆写了接口的getPieChartData()方法publicclassPieChartViewextendsAbstractChartViewimplementsPieChartDataProvider{......

java当中的接口里面的方法全是抽象的而且是public的

问题描述 java当中的接口里面的方法全是抽象的而且是public的 java当中的接口里面的方法全是抽象的而且是public的,为什么没有abstract和public关键词修饰呢 解决方案 接口中不允许private.protected,只能是public,所以语法规定不用写了.同理,接口不能包含函数实现,肯定是abstract的.所以也不用写了. 解决方案二: 14. JAVA 枚举(Enum.类集EnumMap&EnumSet .实现接口.定义抽象方法) ----- 学习笔记

odi 接口 会话-请问各位大神,想要获取ODI里面的“会话”信息,该利用什么接口?

问题描述 请问各位大神,想要获取ODI里面的"会话"信息,该利用什么接口? 如题,有人做过这方面相关的研究吗?如果有可否共享下接口代码,由于现在急用又还找不到..

利用ASP实现事务处理的方法

事务处理|事务处理 在开发Web应用时,无一例外地需要访问数据库,以完成对数据的查询.插入.更新.删除等操作.受应用逻辑的影响,有时需要将多条数据库操作指令组成一个工作单元(事务).在数据库中,所谓事务是指一组逻辑操作单元,它使数据从一种状态变换到另一种状态.为确保数据库中数据的一致性,应当用离散的成组的逻辑单元操作数据:当它全部完成时,数据的一致性可以保持:而当单元中的一部分操作失败时,整个事务会被全部忽略,所有从起始点以后的操作全部退回到开始状态. 实际上,在默认方式下对数据库的每一次操作都

jsp利用application统计在线人数的方法

 这篇文章主要介绍了jsp利用application统计在线人数的方法,代码中备有较为详尽的注释便于理解,是比较实用的技巧,需要的朋友可以参考下 本文实例讲述了jsp利用application统计在线人数的方法.分享给大家供大家参考. 具体实现方法如下: 代码如下: <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String pat