7/09/2005

Hook DHTML Commands

Hook DHTML Commands


浏览器在执行很多命令之前都会允许容器来替换默认的处理。在执行一些默认的命令之前,系统会查询用户对IDocHostUIHandler的实现对象的IOleCommandTarget接口,调用默认(NULL)或者CGID_DocHostCommandHandler命令组的命令。如果容器的对应命令处理返回S_OK。那么默认的处理就不会被调用。


下面列出一些可以在容器中自定义的操作:(这些常量的定义位于docobj.h中)



  • OLECMDID_PRINT,默认命令组
  • OLECMDID_SHOWSCRIPTERROR, CGID_DocHostCommandHandler命令组
  • OLECMDID_FOCUSVIEWCONTROLSQUERY, CGID_DocHostCommandHandler命令组
  • OLECMDID_SHOWPAGEACTIONMENU, CGID_DocHostCommandHandler命令组

MFC提供了一些比较容易扩展的类和宏,这样可以很容易地在扩展容器来实现新的接口。这里使用CCmdTarget类提供的GetInterfaceHook虚函数来进行扩展。



浏览器控件访问容器的方式是查询容器的IDocHostUIHandler接口,而对于浏览器辅助对象(Browser Helper Object/ BHO),不能修改容器来增加一个新的接口。这时候可以通过HTML文档的ICustomDoc接口来设置自己的IDocHostUIHandler接口。



在捕获容器的命令的过程中发现一些其他命令也被发送到容器(按时间顺序):































行为命令组命令
加载NULLOLECMDID_SETDOWNLOADSTATE
000214D0-0000-0000-C000-000000000046OLECMDID_PASTESPECIAL/ OLECMDID_HIDETOOLBARS / OLECMDID_PREREFRESH/ OLECMDID_ONUNLOAD
NULLOLECMDID_SETPROGRESSMAX/ OLECMDID_SETPROGRESSPOS/ OLECMDID_SETDOWNLOADSTATE
打印 CGID_DocHostCommandHandlerOLECMDID_PRINT
刷新CGID_DocHostCommandHandler0x1799
NULLOLECMDID_PREREFRESH/ OLECMDID_SETPROGRESSMAX/ OLECMDID_SETPROGRESSPOS/ OLECMDID_SETDOWNLOADSTATE
000214D0-0000-0000-C000-000000000046

 

OLECMDID_ONUNLOAD/ OLECMDID_PREREFRESH

不是所有常用操作都会转发到容器。OLECMDID_PRINTPREVIEW、OLECMDID_SAVEAS、OLECMDID_REFRESH看起来就没有被转发。


参考文档:



Visual Studio 2005 June CTP的资源编辑器似乎有点问题,改过资源就保存不到原文件了,只能保存到另一个文件,关闭Visual Stuio之后替换(关闭solution都不行)。

7/05/2005

Visual Studio 2005中MFC的变化

关于新功能的说明http://msdn2.microsoft.com/library/y8bt6w34(en-us,vs.80).aspx

一些源代码的变化:

对CLR、.Net类库和Winform控件的支持。
多处安全性的增强,对于函数参数和消息影射类型的检查加强。对ISAPI的支持看起来改动很大。
对基于64位处理器的软件开发的支持。
一些过时功能,例如MFC的DAO类,的使用受到限制。对于64位开发环境,MFC的DAO类是被禁用的。
OLE控件容器和激活状态的改进
新增加的ENSURE宏在ASSERT之外还可以抛出异常。
修正了一些BUG
VC7引入的对GetHtmlDocument()的引用导致内存泄漏的问题。
CHtmlView::ExecFormsCommand中调用IOleCommandTarget::Exec时参数写反了的问题
把CArchiveException::generic修改为CArchiveException::genericException以避免潜在的关键字冲突(微软看起来又准备引入一个新的关键字)