如何使用C++创建COM组件(ATL项目)

时间:2022-03-16 01:38:56

基础

ActiveX和OLE的核心技术是com,但区别是OLE针对的是桌面上应用软件和文件之间的集成,而ActiveX则以网络应用与用户交互为主。com是独立于语言的组件体系结构,可以用C++、Java和VB等任意一种语言编写com对象。 

COM组件的优点有:

通过接口对功能分类;

功能扩充,只需添加接口就行;

可轻松实现进程间调用、分布式调用;

具有封装、继承、多态的面向对象特征。

借鉴文章:http://blog.csdn.net/tjulmy/article/details/2573097

新建工程

如何使用C++创建COM组件(ATL项目)

一路next直到finish,新的solution exporer界面如下所示:

如何使用C++创建COM组件(ATL项目)

添加一个新类

1.添加ATL Simple Object类;

如何使用C++创建COM组件(ATL项目)

2.填写类名和ProgID,一般ProgID可为工程名.类名(test.one),然后next.

3.next > next > finish.

新增三个文件.h,.cpp和.rgs。

如何使用C++创建COM组件(ATL项目)

编码实现功能

这里添加的类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>