四. 应用ATL的一个例子
上面介绍了使用ATL创建一个COM服务程序的基本过程。在介绍过程中,我们实际上已经生成了一个COM服务程序的基本框架,只是没有填写实际的内容。在下面部分,我们实际开发一个十分简单的COM服务程序,并且为它编写一段客户代码进行测试,使大家对使用ATL开发COM服务程序的过程有一个全面整体的了解。
我们要开发的服务程序的功能很简单,它只实现一个接口,这个接口名字是ISimpleInterface,接口只有一个成员函数,叫做Welcome。这个函数的功能只是输出一个“Hello World!”的字符串。
按照上一部分介绍的创建COM服务程序的步骤,我们进行如下的操作:
1 打开Visual C++集成开发环境;
2 创建一个称为SimpleTest的ATL工程;
3 在这个工程中插入新的对象,对象的名字是SimpleInterface;
4 设置接口ISimpleInterface的有关属性,使它成为一个双接口;
5 在对象的接口ISimpleInterface中加入方法Welcome;
6 打开ATL加入的Welcome方法的框架,可以看到如下的代码段:
STDMETHODIMP CActiveXObject::get_TestProp(long *pVal)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState())
// TODO: Add your implementation code here
return S_OK;
}
7 将程序框架中的注释部分替换为下面的代码:
::MessageBox(NULL,_T(”Hello World!”),_T(”Welcome”), MB_OK);
Welcome方法被调用时将弹出一个消息框。
8 编译连接工程。
上面的步骤完成以后,我们就有了一个简单的COM服务程序,而且已经被注册到当前系统中。
下面我们要完成一个简单的COM客户程序。一个COM客户程序简单地说是使用COM组件对象的程序。客户程序调用COM对象的基本流程是:
创建COM对象的实例。这可以通过调用Windows系统的API函数CoCreateInstance来完成。
通过接口调用函数。
调用IUnknown::Release释放COM对象实例
我们的客户程序是使用MFC编写的一个基于对话框的简单应用程序。具体的过程如下:
(1) 打开Visual C++集成开发环境;
创建一个称为SimpleClient的基于对话框的MFC工程;
在对话框中加入一个按钮,名字为TEST;
在SimpleClient.cpp文件中加入如下的代码:
(2) 在cpp文件 #include “simpleclientdlg.h”之后加入下面的代码:
#include “d:\simpletest\simpletest_i.h” // 根据需要修改头文件的路径
加入的头文件是在编译COM服务程序过程中自动生成的,其中包含接口本身的定义、接口IID的定义和COM对象的CLSID的定义。包含该头文件可以使客户程序能够使用COM服务程序。
(3) 在按钮TEST的消息控制函数中加入如下的代码:
HRESULT hr;
ISimpleInterface* pIntf = NULL;
hr = CoCreateInstance(CLSID_SimpleInterface, NULL, CLSCTX_SERVER ,
IID_ISimpleInterface, (void **)& pIntf);
if(SUCCEEDED(hr))
{
pIntf-Welcome();
pIntf-Release();
}
上面的代码首先通过系统API CoCreateInstance创建COM对象,得到接口的指针,然后调用接口成员函数Welcome,最后通过IUnknown::Release()函数释放COM对象实例。
9 编译连接客户程序
最后,我们可以测试客户程序是否正常运行。启动客户程序,当单击“TEST”按钮时我们可以看到弹出一个消息框,这正是我们的COM服务程序提供的功能。