基础
ActiveX和OLE的核心技术是com,但区别是OLE针对的是桌面上应用软件和文件之间的集成,而ActiveX则以网络应用与用户交互为主。com是独立于语言的组件体系结构,可以用C++、Java和VB等任意一种语言编写com对象。
COM组件的优点有:
通过接口对功能分类;
功能扩充,只需添加接口就行;
可轻松实现进程间调用、分布式调用;
具有封装、继承、多态的面向对象特征。
借鉴文章:http://blog.csdn.net/tjulmy/article/details/2573097
新建工程
一路next直到finish,新的solution exporer界面如下所示:
添加一个新类
1.添加ATL Simple Object类;
2.填写类名和ProgID,一般ProgID可为工程名.类名(test.one),然后next.
3.next > next > finish.
新增三个文件.h,.cpp和.rgs。
编码实现功能
这里添加的类one就是一个接口,在.cpp中可以实现多个方法。
注意,不要忘记在test.idl文件中声明将要暴露出去的方法,one接口的clsid是:59CF380D-5F6C-44A0-BAC0-F81D1ADAE4CD。
[ object, uuid(E2CC7541-888A-439B-BAA8-E144D91CE875), dual, nonextensible, pointer_default(unique) ] interface Ione : IDispatch{ [id(1), helpstring("方法SetParam")] HRESULT SetParam([in] LONG param1, [in] char param2); [id(2), helpstring("方法GetVersion")] HRESULT GetVersion([out,retval] BSTR* pVal); }; [ uuid(FC174988-A41D-4C99-99B4-E3083BA8ED6C), version(1.0), ] library testLib { importlib("stdole2.tlb"); [ uuid(59CF380D-5F6C-44A0-BAC0-F81D1ADAE4CD) ] coclass one { [default] interface Ione; }; };如果有很多功能,为便于管理,可把所有实现功能的方法分类,一个接口管理一类方法。
调用演示
准备工作:1.把test.dll文件放在system32(64位系统:SysWOW64)下;
2.通过命令行注册该dll文件:regsvr32 test.dll;
3.编辑测试页面。
<html> <head> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8"> <TITLE>测试页</TITLE> </head> <body> <OBJECT ID="example" height="1" width="1" CLASSID="CLSID:"59CF380D-5F6C-44A0-BAC0-F81D1ADAE4CD"></OBJECT> <script> function Info() { tb_result.value = "方法setparam:" + example.SetParam(9, "a") + "\r\n" + "\r\n"; tb_result.value = tb_result.value + "方法getversion:" + example.GerVersion() + "\r\n" + "\r\n"; } </script> <input type="button" value="测试" onclick='Info()'/><br /> <textarea name="tb_result" rows="1" cols="20" id="tb_result"style="height:70%;width:70%;"></textarea><br /> </body> </html>