使用Microsoft Agent的COM接口编程
2008-02-23 05:37:49来源:互联网 阅读 ()
OLE编程的基础知识
早期的OLE(现称为OLE 1)首次出现在Windows 3.1中,其主要用途是生成复合型文档,使得一个应用程式的文档能够通过链连或嵌入的方式包含其他应用程式的数据(对象)。随着软件组件技术变得日益重要起来,Microsoft在OLE 1的基础上设计了OLE 2,利用他能够实现二进制级上可重用的软件组件,并且控制这些组件的版本和扩充其功能变得相当容易。由于OLE 2的体系结构被设计成为开放式的、可扩充的,所以以后不会再出现OLE 3或4。经过多年的发展,如今的OLE已包括了OLE自动化、COM、COM+、DCOM和ActiveX等多项技术,他们是ActiveDirectory(将用于NT 5.0的一项关键技术)、OLE Messaging、DirectX 、Active Controls、ActiveX Scripting和Task Scheduler等等多种新技术的基础,OLE已不再是Object Linking and Embedding的缩写,他变成了一个单独的单词,专门用来表示Microsoft的软件组件集成技术。
COM是OLE技术的基础,他规定了对象之间如何相互通讯,符合COM规范的对象也叫做COM对象。按照COM的规定,对象内部能够使用任何语言来编写,他们通过接口(Interface)来和外界通信。所谓接口是指对象提供的一组特定的功能调用(方法),每个对象能够有多个接口,不同的对象能够实现同一种接口,客户程式通过对象的接口指针来调用对象的功能。由于OLE规定了组件在二进制级上可重用,客户程式不能够直接访问对象内部的数据,读取或配置对象的属性也都要通过接口来进行。每一种接口都是从一个叫IUnknown接口继承而来,都必须重新实现IUnknown的三个方法:QueryInterface、AddRef和Release,客户程式调用QueryInterface能够获得对象的其他接口指针,AddRef和Release分别将对象的引用计数加一和减一,当引用计数为零时,对象就会被释放。客户程式调用COM对象的一般步骤是首先创建一个对象,然后获取需要的接口指针,调用相应的功能,最后释放接口指针和对象。
C++程式调用Microsoft Agent的基本方法
根据前面介绍的基础知识,下面我们来看看C++程式中如何调用Microsoft Agent。
1.配置和选项
本文使用的编程工具为Visual C++ 5.0,程式为一般的Win32应用程式,为了使程式能够正确地编译连接和运行,您首先需要拥有AgtSvr.h和AgtSvr—i.c两个定义Microsoft Agent的COM接口的文档,他们能够在Microsoft的MS Agent站点(http://www.microsoft.com/workshop/
prog/agent/)上找到,或请下载Microsoft最新的Internet Client SDK或Platform SDK,其次,请在Project/Settings/Link菜单中加入以下的库:ole32.lib、oleaut32.lib、uuid.lib、odbc32.lib odbccp32.lib,最后要确保系统中安装有Microsoft Agent及动画人物数据。
2.创建Microsoft Agent对象
创建OLE对象之前需要初始化OLE,这由OleInitialize()函数来完成,假如OLE初始化不成功,那么就无法继续执行后面的代码,创建对象由CoCreateInstance()函数来完成:
if (FAILED(OleInitialize(NULL))) return -1;//初始化OLE hRes = CoCreateInstance(CLSID—AgentServer,NULL,CLSCTX—SERVER,IID—IAgent,(LPVOID *)&pAgent);//创建Microsoft Agent Server的实例 if (FAILED(hRes)) return -1; |
CoCreateInstance()的第一个参数是对象的CLSID(类代码),Microsoft Agent Server的CLSID为定义在AgtSvr—i.c文档中的CLSID—AgentServer,这个128位的编码唯一地标识了Agent服务器,服务器所在路径和运行参数等信息都放在系统注册表中;第二个参数一般情况下设为NULL;第三个参数用来指明对象的运行环境,如远程或本地,此处设为CLSCTX—SERVER;第四个参数指明用来和对象通信的接口的ID,这也是个128位的编码,Agent的接口ID为IID—IAgent;第五个参数是用来接收IAgent的接口指针。
假如Microsoft Agent Server还没有在内存中运行,那么CoCreateInstance()会启动他并创建一个Agent对象,假如服务器已运行了,则CoCreateInstance()会和之连接并创建一个Agent对象。当任何的Agent对象都被释放了后,服务器自动退出。
3.装入动画人物数据
下面的代码调用IAgent::Load()方法来装入一个动画人物的数据,由于Agent服务器在自己的内存空间中运行,所以传送的字符串变量需要用SysAllocString()来分配内存:
VariantInit(&vPath); //初始化OLE变量
vPath.vt = VT—BSTR; //指明变量类型为Unicode的字符串
vPath.bstrVal=SysAllocString(kpwszCharacter);
//kpwszCharacter为动画人物数据的存放路径
hRes = pAgent->Load(vPath,&lCharID,&lRequestID);
//装入数据,人物ID在lCharID中返回
hRes = pAgent->GetCharacter(lCharID,&pdCharacter);
//获取lCharID的IDispatch接口指针调用IDispatch::QueryInterface()方法能够得到 //IAgentCharacter的接口指针:
hRes = pdCharacter->QueryInterface(IID—IAgentCharacter, (LPVOID *)&pCharacter); pdCharacter->Release(); //释放IDispath |