内容概要
[1] 在Visual Studio2008下使用Visual C++ ATL项目向导,完成一个COM服务( DLL),可在HTML中调用。
[2]用Visual Studio打包成安装文件, 在客户端自动注册。
假设读者有在Visual Studio 2008下的C++开发经验,主要是给自己看的,很多地方省略了。
正文
建立COM控件
第一步:选择[Visual C++]->[ATL Project],输入项目名称后,点击[OK]继续
第二步:项目向导中“Server type”选择“Dynamic-link library(DLL)”,“Additional options”选择“Allowmerging of proxy/stub code”
第三步:为你的ATL项目(容器)添加供外部使用的Class (ATL Simple Object)。选项页 “ C++”的“Short name”输入栏中输入你的Class名称,其它输入框会自动更新。
第四步:“Threading model”选“Apartment”;“Interface”选“Dual”;“Aggregation”选“No”;“Support”选“Connection points”和“I Object With Site(IE objects support)”。
第五步:在“Class View”中,右键单击要添加方法的Interface的名称,在弹出菜单中选择“Add Method”,添加方法。为参数列表添加参数要注意,“retval”属性的参数只能放在参数列表的最后一个,并且只能有一个,要返回字符串,参数类型可以选择“BSTR*”,要返回Long类型,参数类型可以选择“LONG *”。完成后,在函数体内添加代码。
第六步:添加IE支持
在你新的类名的H文件的“ publicIObjectWithSiteImpl<你的类名>,”代码段后面添加下面这个代码段“
publicIObjectSafetyImpl<你的类名,INTERFACESAFE_FOR_UNTRUSTED_CALLER|INTERFACESAFE_FOR_UNTRUSTED_DATA>,”。
在“COM_INTERFACE_ENTRY(IObjectWithSite)”后面插入“COM_INTERFACE_ENTRY(IObjectSafety)”代码段。
第七步(最后一步):右键单击资源文件选择“View Code”找到“CompanyName”等信息做修改。修改资源文件的语言为“中文(简体)”,否则,用户查看文件信息(你写的中文注释)会是乱码。
第八步:按F7编译Solution,如何没有错误,IDE会自动为你注册COM服务。你也可以使用regsvr32命令手动注册或反注册生成的DLL文件。
测试COM控件
我们新建的这个COM服务用“ActiveXControl test Container”这个容器做测试,会找不到这个COM,我们的ATL项目生成的DLL可能不是严格意义上的Active X控件的缘故。
用VB程序做测试
通过在VB项目里Add reference添加COM组件
示例代码如下
- Private Sub Button1_Click(ByVal sender As System.Object, ByVal e AsSystem.EventArgs) Handles Button1.Click
- Dim objTestATL As Simple_ATLLib.First_ATL
- Dim lngReturnValue As Long
- objTestATL = New Simple_ATLLib.First_ATL
- lngReturnValue = objTestATL.AddNumbers(5, 7)
- MsgBox("The value of 5 + 7 is: " & lngReturnValue)
- End Sub
其中“Simple_ATLLib”是项目名称加lib,“First_ATL”是你刚才新建的Classs名称,“AddNumbers”是你为这个Class新建的方法名。
用HTML页面做测试
下面是示例代码,其中classid可以从First_ATL.rgs中查找,其中“First_ATL”是你要在HTML中实例化的Class的名称。
- <object classid="clsid:F0FF2E0D-A56B-40A4-A4D1-F84032606F20" id="Dean" name = "Dean" ></object>
- <form id="form1" name="form1" method="post" action="">
- <a href="#" onclick="return CallUSB();">js调用ActiveX测试</a>
- <input id="Write" name="Write"type="button" value="vb调用ActiveX测试"/>
- </form>
- <SCRIPT LANGUAGE="JavaScript">
- //JavaScript调用Demo
- function CallUSB()
- {
- try{
- varUSBContent = Dean.AddNumbers(5, 7);
- alert(USBContent);
- }catch (e) {
- alert("错误号: " +e );
- }
- return false;
- }
- </SCRIPT>
配置安装包
第一步:在当前Solution中添加New Project,选择project类型为“[Other project Types]->[Setup and Deployment]->[Setup Wizard]”。在向导的选项卡中选择“Primaryoutput from 你的ATL项目名称”,其它可以取默认值。
第二步:修改公司名称、语言类型、安装位置等信息。
第三步:“Detected Dependencies”中有些DLL你不需要打包进来,可以排除它们。
第四步(最后一步):点击你的“Primary output”的那一项,在属性窗口中找到“register”属性,它的默认值为“vsdrpDoNotRegister”,改为“vsdrpCOMSelfReg”。这样你的程序在用户机器中安装好后,你的DLL也在用户机器中注册好了。
其它
[1]在添加的ATL Simple Object类型的Class,public域里,可以修改原FinalRelease的声明为STDMETHOD(FinalRelease)();
然后在CPP文件里实现这个声明,可以实现当IE窗口关闭时,做一些对象清理工作。
遗留问题
[1]本文不包含数字签名的相关信息
[2]ActiveX在IE中正常,但是不能在Firefox中正常运行