快速业务通道

使用Microsoft Agent的COM接口编程

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-29
reateInstance()函数来完成:

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

 

通过IAgentCharacter接口就可以调用动画人物支持的各种方法了:

hRes = pCharacter->Show(FALSE, &lRequestID);//显示动画人物
hRes = pCharacter->MoveTo(320,240,100,&lRequestID); //移动动画人物到屏幕中央
bszSpeak = SysAllocString(L"Hello World!"); //分配字符串
hRes = pCharacter->Speak(bszSpeak, NULL, &lRequestID); //让动画人物说话
SysFreeString(bszSpeak); //释放字符串所占内存

 

4.释放对象

程序在退出之前需要把创建的Agent对象释放:

if (pCharacter) {
pCharacter->Release(); //释放IAgentCharacter接口
pAgent->Unload(lCharID); //卸载动画人物数据
}
pAgent->Release(); //释放Agent对象
VariantClear(&vPath); //清除OLE变量

进一步的编程要点

前面介绍的是调用Microsoft Agent服务器最基本的一些步骤,为了完成比较实际的任务,客户程序还应根据自己的情况考虑下面的一些编程要点。

1.检查Agent Server的版本

OLE要求组件或对象具有向后兼容性,高版本对象支持低版本对象的所有接口和属性,这样可以很方便地进行组件升级。客户程序通常应检查对象的版本,只有系统中安装的对象的版本号高于或等于所期望的版本号时才能调用对象。下面的IsValidAgentVersion()函数检查Microsoft Agent的版本号,并将它与定义在AgtSvr.h文件中的版本号相比较:

BOOL IsValidAgentVersion(IAgent *pAgent) {
IDispatch *pdAgent = NULL;
ITypeInfo *pTypeInf

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号