鱼C论坛

 找回密码
 立即注册
查看: 2961|回复: 10

需要关于网页控件访问的知识

[复制链接]
发表于 2012-4-5 22:32:42 | 显示全部楼层 |阅读模式
50鱼币
本帖最后由 Mr.C 于 2012-4-6 07:49 编辑

最近想同事做一个自动填写网页表单的程序。
发现网页上的表单根本就没有句柄,无法通过句柄进行访问。
网上有相关的实例,不过我现有知识结构暂时看不懂。
请详细介绍一下访问网页控件的原理。以及我需要先了解哪些知识。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-4-7 01:07:49 | 显示全部楼层
本帖最后由 Mr.C 于 2012-4-7 01:27 编辑

看来,只能自食其力了,今天上网搜索一些线索出来了。
得先了解一下DOM文档对象模型
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-4-7 09:51:15 | 显示全部楼层
要了解DOM,需要建立以下知识准备
XML
|
XHTML  JavaScript
|__________|
           |
         DOM
难怪没人回复,这不是一个小问题啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-4-7 12:53:14 | 显示全部楼层
document.getElementById("answer").value=XXXXX
找到关键了
看了一早上关于html dom的资料,有点收获
目前就大概了解了一些原理。
深入研究的话可能要系统地学习DOM
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-4-7 15:51:04 | 显示全部楼层
了解DOM模型和API后,在JaveScript中可直接调用document对象。
而外部使用C/C++获取该对象,成了目前的难题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-4-8 00:07:13 | 显示全部楼层
躲宿舍研究了整整一天。总于搞定了。
想研究网页控制的朋友可以参考。
首先,基础知识,不用深究,大局把握了解以下即可。
分别是XML, HTML, DHTML(这三种语法差不多), JavaScript(语法跟C差不多)
更深入点需要掌握DOM模型,以及通过DOM的相关API访问网页元素的原理。
然后就是关键地方了, 研究了一上午自认为搞定了, 后来发现DOM中的document对象是只有在
网页JavaScript中才能被直接调用的。太坑爹了。
然后学习重点转向外部程序如何获取document对象。百度了无数文档。
另外一个关键点,大部分文档资料提到的document对象的属性在VC中是不适用的。
我一直渡认为是我装的VC有问题,纠结了很久。
在.net中或在VB等环境下, 通过WebBrowser控件提供的类, 定义好一个对象后,可直接调用
该对象.document 然后就完事了。
而在C++的CWebBrowser类下,并没有document这个成员。而只有一个GetDocument成员函数。
而GetDocument返回的并不是我们可以直接用的接口指针。而是一个DISPATCH接口。
参考了网上的代码,以及我个人的理解,
转换代码如下:
        LPDISPATCH  docbrowser = m_webCtrl.GetDocument();
        //在COM中有一个IDISPATCH接口,LPDISPATCH是一个指向这个接口的指针
        IPersistStreamInit *pPSI=NULL;
        //其实就是IUnknown类型的宏定义结果
        docbrowser->QueryInterface(&pPSI);
        //所有的COM接口都继承了IUnknown,
        //每个接口的vtbl中的前三个函数都是QueryInterface、AddRef、Release。
        //这样所有COM接口都可以被当成IUnknown接口来处理。   
        //函数功能:IUnknown的一个成员函数,
        //客户可以通过此函数来查询某个组件是否支持某个特定的接口。
        //若支持QueryInterface将返回一个指向这些接口的指针,
        //不支持返回值将是一个失败结果。
        HGLOBAL hHTMLText =  GlobalAlloc(GMEM_FIXED, 1024*10); 
        //该函数从堆中分配一定数目的字节数,HGLOBAL表示由GlobalAlloc函数分配的内存句柄
        IStream *pStream = NULL;
        //定义一个空的流对象指针
        memset(hHTMLText,'\0',1024*10);
        //初始化
        CreateStreamOnHGlobal(hHTMLText, TRUE, &pStream); 
        //从指定内存创建流对象
        pPSI->Save(pStream, FALSE);
        //保存一个对象到指定的流
        //至此GetDocument返回的接口指针,转来转去到了pPSI上,头都晕了
        //html代码保存在hHTMLText中,用char*指向之即可用了
        ::MessageBox(NULL, (char*)(hHTMLText), "", 0);
至此,我们就获得到指定页面的的代码的指针了。
接下来的事就简单,根据DOM模型,向下索引到我们要读取的元素即可。
GetElementByID 是最直接的索引方式。
余下的事过两天再研究了,明后天要开会。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-4-8 00:14:21 | 显示全部楼层
楼上的代码,必须写在响应ondocumentcomplete事件中。
原因很简单,要获取网页代码,要等document完全complete后才行。
否则返回值会是零。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-9-10 14:51:34 | 显示全部楼层
好东西,谢谢分享!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-8-13 10:56:20 | 显示全部楼层
{:1_1:}厉害
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-11-14 22:49:52 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-1-20 01:32:58 | 显示全部楼层
学习学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-27 19:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表