VC编程之使用VC2008中ATL开发浏览器控件
小标 2018-08-28 来源 : 阅读 1450 评论 0

摘要:本文主要向大家介绍了VC编程之使用VC2008中ATL开发浏览器控件,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

本文主要向大家介绍了VC编程之使用VC2008中ATL开发浏览器控件,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助。

 
介绍
本文将介绍使用VC2008中的ATL开发一个用于网络部署的cab控件包的过程。
 
 
建立ATL项目
打开VS2008,建立一个ATL项目,如下图:
 

考虑到简介性,选择了"Allow merging of proxy/stub code"
 
添加ATL控件
(建议先编译一下真个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,
    ...
 
在BEGIN_COM_MAP(CXXXXX)部分插入实现:
BEGIN_COM_MAP(CXXXXX)
   ...
   COM_INTERFACE_ENTRY_IID(IID_IObjectSafety, IObjectSafety)
   ...
END_COM_MAP()
 
封装为cab包及网络部署
由于一般情况下控件会包含其它相关资源项,如附加依赖的dll或配置文件、资源文件等。所以更多的控件以cab包形式发布。
cab包需要一个.inf说明包的信息,一个示例如下:
 


[c-sharp] view plaincopy
 



; file in cab  
[Add.Code]  
test.dll=test.dll  
atl.dll=atl.dll  
; needed DLL  
[atl.dll]  
file-win32-x86=thiscab  
FileVersion=2,00,0,7024  
DestDir=11  
RegisterServer=yes  
[test.dll]  
file-win32-x86=thiscab  
clsid={4CBBC676-507F-11D0-B98B-000000001234}   
FileVersion=1,0,0,1   
RegisterServer=yes  
; end of INF file  

 
 
把这个包和相关的控件及其它文件等放到一个目录下,在命令行下使用makecab命令进行打包,之前需要准备一个.ddf文件说明需要哪些文件打包
 
 


[c-sharp] view plaincopy
 



.OPTION EXPLICIT  ;Generate errors  
.Set CabinetNameTemplate=Uploader.cab  
.Set DiskDirectoryTemplate=CDROM   ;All cabinets go in a single directory  
.Set CompressionType=MSZIP   ;All files are compressed in cabinet files  
.Set UniqueFiles="OFF"  
.Set Cabinet=on  
.Set DiskDirectory1=Uploader.cab  
; file list  
Uploader.dll  
Uploader.inf  

 
 
之后调用makecab /F xxx.ddf,即可获得一个用于发布的cab文件。
使用方法为设置codebae="[#version=1.0.0.1]"
 
结论
由于ATL的框架,极大地方便了控件的编程,但需要熟悉基本的COM理论,并注意框架中添加代码的步骤,否则很容易出现莫名的错误。

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言VC/MFC频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved