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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
开发中的社区游戏,要求将原来的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;
   // .......other codes.
   //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
   vNull.vt = VT_BSTR;
   vNull.bstrVal = NULL;
   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;
    SafeArrayDestroy(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); 
第三,   vPostData的变量类型是VT_ARRAY | VT_UI1,其数据是一个SAFEARRAY型的字符数组,具体赋值请参看代码。
   // Set value
   vNull.vt = VT_BSTR;
   vNull.bstrVal = NULL;
    iBrowser->Navigate2(&vURL, &vFlags, &vNull, &vPostData, &vHeaders);
 
 
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/kesalin/archive/2007/11/11/1878959.aspx
posted @   alex618  阅读(7252)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示