网页内嵌的 ActiveX 通常是通过 HTML 的 <param> 标签来进行初始化的,例如:
1 2 3 4 | <object classid=clsid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx>
<param name="param1" value="value1" />
<param name="param2" value="value2" />
</object> |
虽然由 <param> 指定的各种属性可以在运行时通过 ActiveX 对象接口中相应的 put/get 方法进行存取,但这种方法并不是对所有的属性都有效。例如,IShockwaveFlash 的 WMode 属性。
为了能够完全控制 IE 之中 ActiveX 控件的初始化,也就是以指定的属性来初始化 ActiveX 控件,就必须在 ActiveX 创建之前做出相应的处理。在这之前,让我们先看一看 Trident 内核之中 ActiveX 控件的创建和初始化机制:
- 调用 CoGetClassObjectFromURL 创建目标对象的类厂;
- 调用类厂的 CreateInstance,创建目标对象;
- 从目标对象接口中查询 IPersistPropertyBag 接口,并调用 IPersistPropertyBag::Load 加载由 Trident 内核解析出来的属性包;
- 根据属性包初始化 ActiveX 控件。
这个过程虽然只有简单的 4 个步骤,但探究的过程却是十分漫长的,在此略过不叙。
针对这 4 个步骤,我们可以相应地使用以下策略来最终控制目标对象的初始化:
- 挂钩 CoGetClassObjectFromURL,捕获目标 ActiveX 的类厂,替换或挂钩类厂的 CreateInstance 方法;
- 在调用类厂的 CreateInstance 创建出 ActiveX 实例对象之后,查询其 IPersistPropertyBag 接口,并挂钩该接口的 Load 方法;
- 当执行的流程进入到 IPersistPropertyBag::Load 之后就可以接管由 Trident 传入的 IPropertyBag 接口了,挂钩其 Read 方法;
- 在挂钩后的 IPropertyBag::Read 方法中处理感兴趣的属性和属性值。
代码就不给出了,几个钩子而已。套用一句去年蛮流行的歌词,曰:
有挂钩就会有奇迹。
不知道在哪留言合适,想请教一个问题,windows mobile 开发选什么书入门比较合适。
从当当网上看了很多,感觉没有合适的。准备用C++开发,开发工具是VS 2008 ,有桌面程序开发经验3年
既然有桌面开发的经验,Windows Mobile 可以很快上手。最好的办法是到书店自己选一下,选自己适合的书。