码迷,mamicode.com
首页 > 其他好文 > 详细

使用VC2008中ATL开发浏览器控件

时间:2015-09-03 12:41:23      阅读:662      评论:0      收藏:0      [点我收藏+]

标签:

http://blog.csdn.net/cnjet/article/details/6218355

 

使用VC2008中ATL开发浏览器控件

 

2011.03.02

freecnjet@gmail.com

 

 

介绍

本文将介绍使用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<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()

 

封装为cab包及网络部署

由于一般情况下控件会包含其它相关资源项,如附加依赖的dll或配置文件、资源文件等。所以更多的控件以cab包形式发布。

cab包需要一个.inf说明包的信息,一个示例如下:

 

[c-sharp] view plaincopy
 
  1. ; file in cab  
  2. [Add.Code]  
  3. test.dll=test.dll  
  4. atl.dll=atl.dll  
  5. ; needed DLL  
  6. [atl.dll]  
  7. file-win32-x86=thiscab  
  8. FileVersion=2,00,0,7024  
  9. DestDir=11  
  10. RegisterServer=yes  
  11. [test.dll]  
  12. file-win32-x86=thiscab  
  13. clsid={4CBBC676-507F-11D0-B98B-000000001234}   
  14. FileVersion=1,0,0,1   
  15. RegisterServer=yes  
  16. ; end of INF file  

 

 

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

 

 

[c-sharp] view plaincopy
 
  1. .OPTION EXPLICIT  ;Generate errors  
  2. .Set CabinetNameTemplate=Uploader.cab  
  3. .Set DiskDirectoryTemplate=CDROM   ;All cabinets go in a single directory  
  4. .Set CompressionType=MSZIP   ;All files are compressed in cabinet files  
  5. .Set UniqueFiles="OFF"  
  6. .Set Cabinet=on  
  7. .Set DiskDirectory1=Uploader.cab  
  8. ; file list  
  9. Uploader.dll  
  10. Uploader.inf  

 

 

之后调用makecab /F xxx.ddf,即可获得一个用于发布的cab文件。

使用方法为设置codebae="<cab file url>[#version=1.0.0.1]"

 

结论

由于ATL的框架,极大地方便了控件的编程,但需要熟悉基本的COM理论,并注意框架中添加代码的步骤,否则很容易出现莫名的错误。

使用VC2008中ATL开发浏览器控件

标签:

原文地址:http://www.cnblogs.com/gamekk/p/4780009.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!