2004年以前,自己曾经大量使用过ActiveX控件。由于当时使用的VC6对ActiveX的支持很好,使用起来很方便,而且ActiveX控件本身就是一个MFC的窗口,有自己的消息循环。而当年自己的技术水平还不够成熟,不知道有回调函数的存在。因此能够对外触发事件通知的ActiveX控件一度是我的最爱。而后来,随着自己水平的提升,对功能的分解不再依赖于动态库、ActiveX控件等客观因素,而是通过主动的功能接口规划来进行。而且为了追求产品的部署简易性,一度爱不释手的ActiveX被我打入冷宫多年。
直到有一天,我的一个产品需要改造为在Web中能够使用,我于是又想起尘封已久的ActiveX,而多年过去手中的编译环境已经是进化到了VS2005了(而今更是用上了VS2008、VS2010)。一番尝试之下,发现在VS2005之后,ActiveX的使用方法已经和VC6很不一样了。由于过程还不是那么简单,于是我整理了一份文档,记录下一些使用方法。昨天新开了blog,我想起把这篇文章放到blog上来,比放在电脑上某个角落,然后需要的时候再翻箱倒柜地寻找要强。我写这篇文档时,用的是VS2005,刚才我特意测试了一下VS2008,操作过程基本一样。
无论ActiveX控件有多少缺点或不便,而要在web网页中随意使用MFC来做自己的事情,ActiveX控件依旧是唯一的选择。
不说废话了,VS2005中ActiveX的使用基本使用过程如下:
1 建立ActiveX工程
使用MFC的工程建立向导,建立一个ActiveX工程,此处我建立的工程名为“testX”。如果需要,可以自己修改向导过程中的一些属性。工程建立后,类视图如下。
2 为控件添加接口函数
如上图所示,可以通过右键点击“_DtestX”来添加对ActiveX控制的函数。ActiveX控件的使用者可以通过这些函数来控制和访问ActiveX控件。
(如果把ActiveX控件当作一个黑盒子,通过这些接口函数,你可以向其发消息。)
3 为控件添加触发事件
如上图所示,可以通过右键点击“_DtestXEvents”来添加ActiveX事件。ActiveX控件可以通过这些事件,向使用者反馈信息。
(黑盒子通过这个接口,来对外反馈消息。)
这儿我添加一个ActiveX事件,函数形如“LONG TestEvent(LONG nValue, BSTR strValue);”。
4 在ActiveX控件中触发事件
可以通过以下形式在ActiveX控件中触发事件:
(下面讲的是在控件类如何通过接口对外反馈消息。)
FireEvent(dispidTestEvent, EVENT_PARAM(VTS_I4 VTS_BSTR), nValue, strValue);
上面的EVENT_PARAM的参数,可以参考“DISP_FUNCTION_ID(CtestXCtrl, "TestEvent", dispidTestEvent, TestEvent, VT_I4, VTS_I4 VTS_BSTR)”的最后一个参数,这句代码是向导自动生成的。
5 ActiveX使用者添加更新控件类
在一个普通工程中,可以通过在工程中添加类的方式,弹出如下对话框:
然后添加类到工程,如下:
如果在使用过程中,ActiveX控件接口发生了变化,可以通过删除该类的文件,然后重新添加该类以便达到目的。
6 ActiveX使用者使用ActiveX控件
在VS2005里面,对ActiveX控件的使用就和普通控件一样了,添加变量和添加事件都是一样。这些操作同VC6.0中也是类似的。