标签:
http://blog.csdn.net/cnjet/article/details/6218355
2011.03.02
freecnjet@gmail.com
本文将介绍使用VC2008中的ATL开发一个用于网络部署的cab控件包的过程。
打开VS2008,建立一个ATL项目,如下图:
考虑到简介性,选择了"Allow merging of proxy/stub code"
(建议先编译一下真个project,保证编译成功并顺利注册了控件)
之后添加一个ATL的控件,注意正确的对象类型。
右键选择项目“Add”->"Add Class"
一定要注意选择“ATL控件”,否则事件支持等可能会相对麻烦些,需要自己手动写些接口代码。选择Add后填写必要的控件名称等,进入选项界面:
这里需要注意:如果控件会返回给js/vbs脚本一些消息事件的话,必须选择“Connection points”添加连接点支持。否则需要自己手动在idl中添加连接点接口定义等信息;另外注意"Control type:"的选择,如果是运行时不可见控件或者简单的功能控件等,如果需要返回给js/vbs一些消息事件的话,必须实现IProvideClassInfo2和IProvideClassInfo,此时最好选择Standard control并在后面选择实现,否则的话可以使用Minimal control。
"Next>"出现需要实现的接口对话框,可以根据需要选择,如果返回脚本事件的,至少要实现IProvideClassInfo2接口,如下:
至此,一个ATL控件就创建完成了。建议编译下项目,保证链接成功并正确注册控件。
在“Class view”中添加控件支持的属性和方法。
例如:
具体可以根据需要操作,这里不详述细节。建议编译下保证正确性。
添加事件函数的方法类似于为控件添加函数,不过针对的接口为XXXLib下的_IXXXEvent,如下:
如果出现HTML网页中事件响应不成功,必须保证上面提到一些设置正确,可以手动检查下必要的接口是否实现。
这之后就可以在实现类CXXXX上添加connection point来方便控件内向外发送事件了。具体如下图:
注意:需要一定不要错误选择"Implement Interface"并实现事件接口;
之后控件实现类中就可以调用Fire_XXX来发送事件调用了。
至此,控件就正确实现了,可以使用项目自动产生的.htm文件测试控件的各个接口是否正常工作。
另外:所有的Fire_xxx函数只能在窗口线程中执行,控件窗口未初始化时似乎调用无效,例如FinalConstruct和FinalRelease等函数中。
如果要实现控件可以自注册必须在资源文件中添加
BLOCK "040904e4"
BEGIN
...
VALUE "OLESelfRegister", "/0"
...
END
如果要标记控件的安全性,需要再控件实现文件中添加父类
class ATL_NO_VTABLE CXXXXXX :
...
public IObjectSafetyImpl<CFileUploader, INTERFACESAFE_FOR_UNTRUSTED_CALLER|INTERFACESAFE_FOR_UNTRUSTED_DATA>,
...
在BEGIN_COM_MAP(CXXXXX)部分插入实现:
BEGIN_COM_MAP(CXXXXX)
...
COM_INTERFACE_ENTRY_IID(IID_IObjectSafety, IObjectSafety)
...
END_COM_MAP()
由于一般情况下控件会包含其它相关资源项,如附加依赖的dll或配置文件、资源文件等。所以更多的控件以cab包形式发布。
cab包需要一个.inf说明包的信息,一个示例如下:
把这个包和相关的控件及其它文件等放到一个目录下,在命令行下使用makecab命令进行打包,之前需要准备一个.ddf文件说明需要哪些文件打包
之后调用makecab /F xxx.ddf,即可获得一个用于发布的cab文件。
使用方法为设置codebae="<cab file url>[#version=1.0.0.1]"
由于ATL的框架,极大地方便了控件的编程,但需要熟悉基本的COM理论,并注意框架中添加代码的步骤,否则很容易出现莫名的错误。
标签:
原文地址:http://www.cnblogs.com/gamekk/p/4780009.html