COM课题二-定义COM接口

COM专题二---定义COM接口

Prerequisite:C++ 编程者,熟悉windows编程,熟悉Win32 Dll,了解windows注册表。

作者:收割者

在windows中定义了很多的COM接口,我们可以直接使用这些接口,但是有的时候我们需要定义自己的COM接口。开发COM组件可以利用Windows提供的接口,也可以使用自定义的接口。如果你要使用自定义的接口来开发COM组件,那么第一步就是本篇将要描述的---定义COM接口。

首先打开vs2010,选择菜单“新建”,选择“项目”,这时候弹出来一个模板对话框,选择将要建立的模板。这里选择建立一个空的解决方案,当然,你选择别的也可以,最主要是我们要建立一个解决方案,你选择别的项目的时候,会自动建立一个解决方案。这里我们选择一个空的解决方案,命名为“COMSample”。如下图:

COM课题二-定义COM接口

点击确定,这样我们就建立了一个空的解决方案。

接着,我们打开“解决方案”视图。点击鼠标右键,选择“添加”,选择“新建项目”,注意不是“新建项”,选择“win32项目”,键入名称“COMSample”,刚才的是解决方案的名称,这里这个是解决方案中项目的名称。点击确定。接着,出现设置对话框,选择“dll”,“空项目”选项。点击完成。

COM课题二-定义COM接口

COM课题二-定义COM接口

接着,在COMSample项目上点击右键,选择“添加”,选择“新建项”,注意不是“新建项目”,如下图:

COM课题二-定义COM接口

接着,选择“midl文件(*.idl)”,键入名称,COMSampleInterface,点击添加,这样就完成了idl文件的添加,这个文件主要用来定义COM接口,如下图:

COM课题二-定义COM接口

现在我们打开idl文件,它自动添加的两个import语句我们不用管,它的作用是对基本的数据类型和功能的支持,通过import语句,我们还可以引入别的idl文件,那么那个idl文件中的内容,就可以包含到当前的idl文件中,也可以通过引入typelib类型库,头文件等,引入别的内容,具体这些怎么做,参考msdn,midl章节。

下面,我定义一个接口和组件类,如下图:

import "oaidl.idl";
import "ocidl.idl";
[
	object,
	uuid(709D0F50-727E-41CC-9D60-54139602B59A),
	helpstring("ShouGeZhe_Win32COM"),
	version(1.0)
]
interface IShowGeZhe:IUnknown
{
	HRESULT ShowHelloCOM([in]HWND hwnd);
}
[
	uuid(01D3CF21-D038-4807-941C-2A5394C2F67C),
	helpstring("COMClass"),
	version(1.0)
]
coclass CReaper
{
	interface IShowGeZhe;
}

这里我定义了一个接口,关键字为interface ,定义了一个接口IShowGeZhe,COM接口的名称一般以I***,也就是以大写的“I”开头。每个COM接口都必须直接或是间接的继承IUnknown接口。这里我直接继承。接着,我在接口中添加了一个方法,ShowHelloCOM,返回值为HRESULT,在COM中,方法的返回值都是HRESULT,主要用来确定方法是否成功,这样做的目的也是为了和系统预定义的接口方法兼容,如果要返回执行的结果,用参数传递出去。这个方法还有一个参数,是一个窗口句柄,在它的前面有个属性[in],表示这个参数是由外传入。COM接口定义语言中的属性都是用“[]”来设置。另外在接口IShowGeZhe的前面也有属性,这个属性是必须的,而且用“[]”括起来,object关键字表示这个接口是COM接口,这个必须有,接着是设置这个接口的全局唯一标示符(guid)uudi,全局唯一标示符,vs自带了生成工具,用那个工具可以生成,然后复制到这里。helpstring属性是可选的,version属性也是可选的。

接着,我定义了一个组件类CReaper,关键字为coclass,属性中的uuid必须设置。在下面包含了这个组件类只是的接口。这里是IShowGeZhe。这样我就定义了一个接口和一个组件类。这里我决定用proxy/stub的方式marshal(编列)接口编列方式,如果,要使用类型库的接口编列方式,需要library关键字来定义类型库。这里我不需要,因此不用。这里定义接口使用的是MIDL语言,也就是接口定义语言。要了解更多关于接口定义语言和MIDL编译器的使用,请参考MSDN。

现在我们在解决方案视图中,在刚才我们添加的idl文件上面点击右键,选择“编译”,然后就可以开始编译了,我们使用MIDL默认的控制参数就可以了。编译输出结果如下:

COM课题二-定义COM接口

这个时候,在COMSample win32 dll项目的目录下就多了四个文件。这四个文件很关键。下一篇博客将讲解这四个文件,并利用这四个文件生成“代理/根服务器”--proxy/stub dll。

本篇文章如果出现在****和磐实网站(我推荐的阅读地址)之外的网站,均为非法盗取。这种行为是可耻的。

作者:收割者

推荐阅读地址:http://www.panshy.com/article/Sort_Desktop/other/2014-04-16/2486.php