MFC开发进程外COM,如何定义事件接口

来源:百度知道 编辑:UC知道 时间:2024/05/14 07:59:49
如题:
采用MFC开发,如何定义事件?
看来提问的时候加一句不得从网上复制真的是很有很必要的!

利用利用MFC AppWizard(exe)生成Windows应用程这个向导来完成,关键点是在第二步的时候,将Automation打上勾(默认不打勾),这样得到的工程生成出来的exe文件就具备进程外组件的框架了。以对话框程序为例,SDI和MDI的程序大同小异。首先看一看通过这样的方式得到的工程,除了具备普通Dialog程序的几个文件之外,还多了以下几个文件,分别如下:
DlgProxy.cpp 接口实现文件,类似ActiveXControl向导生成的[ProjectName]Ctrl.cpp
DlgProxy.h 接口实现的定义文件,类似ActiveXControl向导生成的[ProjectName]Ctrl.h
[ProjectName].odl 接口定义文件,ActiveXControl向导也有,作用一样的

组件还没有事件功能,也就是说只能客户端调用组件,而组件不能主动调用客户端。用过VB的人知道,在VB中定义一个组件如果要支持事件的话,必须加上WithEvents关键字。而调用上面得到的组件,不加WithEvents还好,加上了后反而还不行,原因是什么呢?就是组件还不支持事件触发。要使组件支持事件触发要怎么做呢?一般来说需要做两大事情:第一:定义出接口;第二:实现连接点。我这里说的是一般,因为事件的实现还可以用用回调函数实现,或者还有其它的自定义方式,COM是一个规范,很多时候它只提供了一些实现的思路,并没有严格规定一定要这么地。打个比方说吧,事件的触发,如果客户端用VC开发,那么可以很灵活,只要组件和客户端能够相互通信的任何方式都可以考虑;但是如果用VB开发客户端,由于VB已经要求你用连接点机制实现了,组件端不用连接点来实现VB就不认了。VBScript和JavaScript也是这样要求的,所以这个一般的范围还是非常广的,很少有不一般的情况。下面我就以这种一般情形做论述。
首先要定义出接口。这里说出接口是相对于入接口而言的,管理方法的接口叫入接口,因为是提供给别人调的;管理事件的接口叫出接口,因为是调别人的。入接口和出接口你硬要定义在一起,也没有什么不可以,只是习惯上都这么做,且命名上通常是入接口叫IXXX,相应的出接口叫IXXXEven