我们开始做一个IE的插件,最后的效果是:
在IE的Toolbar上加一个按钮,点击后开始工作,将用户在页面上的主要动作记录下来,作成Watji的脚本写到指定文件里。
关键字:
ATL,BHO,IE
开发环境:
Visual Stdio 2005
始めましょう。
1 File->New->Project,如下图操作:
选择OK,以下全部默认选项,最后Finish。
好了,我们的框架算是搭好了。
2 下面,我们开始截获IE的页面事件,并记录下来。
右键单击工程,Add->Class->ATL->ATL Simple Object,选择Add。
填入Short name(例:WebpageEvent),Next,选择如下图:
Finish。
3 追加相关代码。
在WebpageEvent.h里追加SetSite,Invoke方法,并在.cpp文件里实现。
其中,SetSite方法里注册当前IE浏览器。
Invoke方法里,DISPID_DOCUMENTCOMPLETE分支注册页面事件,DISPID_QUIT分支取消注册当前浏览器。
其他的就根据各自需求了,比如,
DISPID_HTMLDOCUMENTEVENTS2_ONCLICK
DISPID_HTMLDOCUMENTEVENTS2_ONFOCUSOUT
注册页面事件,这里用的是连接点的做法,尝试了很多次,出现了很多错误,比如多Frame的不全部支持,或者
某个Frame里的控件被注册了多次,挺郁闷的。前者是因为嵌套做的不好,没有遍历页面上所有Frame的Document,
后者是因为循环的时候没把以前的连接点清除,重复连接了。呵呵,现在搞定了:)
页面事件这块就算完成了。
下面开始写Toolbar上的按钮。
4 重复上面第2步,再加一个ATL Simple Object。
(这次取名叫ExtensionButton)
5 追加相关代码。
在ExtensionButton.h里需要实现IOleCommandTarget接口,追加QueryStatus,Exec方法,并在.cpp文件里实现。
其中,QueryStatus方法时刻监视状态。
Exec方法响应操作。OLECMDEXECOPT_DODEFAULT分支即我们加上的按钮选项。
6 Ctrl+Alt+F7 编译
呵呵,出错了,e:\iregress\iregress\filecommon.cpp(32) : fatal error C1010: unexpected end of file while looking for precompiled header.
Did you forget to add '#include "stdafx.h"' to your source?
右键工程->Properties->Configuration Properties->C/C++->Precompiled Headers,
Create/Use Precompiled Headers选择Not Using Precompiled Headers。
在编译一下。
注意:还是有错。
因为我的程序里用了CStdioFile,需要引进afx.h头文件,好吧,我引进。
hoho,再编译,出了个恐怖的错。
e:\program files\microsoft visual studio 9.0\vc\atlmfc\include\afx.h(24) : fatal error C1189: #error :
Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD[d]
(为什么呢?全是CStdioFile惹的祸。类C和MFC之间有一些东西冲突了,重复定义了。)
有错不要紧,咱知错就改。
右键工程->Properties->Configuration Properties->C/C++->Preprocessor,Preprocessor中去掉_USEDLL。
右键工程->Properties->Configuration Properties->General,Use of MFC中选择Use MFC in a Shared DLL。
然后,右键工程->Properties->Configuration Properties->Linker->Command Line,Additional中填入/verbose:lib。
Bingou!!!(有人说了,我编译还有很多错呢,这个,自己找找?大方向上已经没有什么可说的了)
7 不过大家也别高兴得太早,现在还有注册表没弄呢,不然IE上怎么可能多出个按钮呢,是吧。。。
主要是在.rgs文件里加,具体怎么加网上Sample很多的说。
8 其他一些附属的就不记了,比如写文件的class,主要是在响应事件的地方调用的。自由发挥吧。
就这么多了,第一次开发这类东西,走了不少弯路。做一个痛苦状ing。。。