一片云雾

写博客挺浪费时间的……
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

VS2005/2008中ActiveX的使用

Posted on 2011-10-30 11:41  一片云雾  阅读(2797)  评论(3编辑  收藏  举报

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中也是类似的。