Mr.C 发表于 2012-4-5 22:32:42

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

本帖最后由 Mr.C 于 2012-4-6 07:49 编辑

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

Mr.C 发表于 2012-4-7 01:07:49

本帖最后由 Mr.C 于 2012-4-7 01:27 编辑

看来,只能自食其力了,今天上网搜索一些线索出来了。
得先了解一下DOM文档对象模型

Mr.C 发表于 2012-4-7 09:51:15

要了解DOM,需要建立以下知识准备
XML
|
XHTMLJavaScript
|__________|
         |
         DOM
难怪没人回复,这不是一个小问题啊

Mr.C 发表于 2012-4-7 12:53:14

document.getElementById("answer").value=XXXXX
找到关键了
看了一早上关于html dom的资料,有点收获
目前就大概了解了一些原理。
深入研究的话可能要系统地学习DOM

Mr.C 发表于 2012-4-7 15:51:04

了解DOM模型和API后,在JaveScript中可直接调用document对象。
而外部使用C/C++获取该对象,成了目前的难题。

Mr.C 发表于 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接口。
参考了网上的代码,以及我个人的理解,
转换代码如下:        LPDISPATCHdocbrowser = 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 是最直接的索引方式。
余下的事过两天再研究了,明后天要开会。{:5_103:}

Mr.C 发表于 2012-4-8 00:14:21

楼上的代码,必须写在响应ondocumentcomplete事件中。
原因很简单,要获取网页代码,要等document完全complete后才行。
否则返回值会是零。

2002wmj 发表于 2014-9-10 14:51:34

好东西,谢谢分享!

阔怀 发表于 2015-8-13 10:56:20

{:1_1:}厉害

冲啊大笼包 发表于 2016-11-14 22:49:52

{:10_279:}{:10_279:}

fishc1008 发表于 2017-1-20 01:32:58

学习学习
页: [1]
查看完整版本: 需要关于网页控件访问的知识