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

时间:2022-12-14 23:15:55

基础

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>