Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103587130
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: C/C++

2008-04-15 20:57:34

   来源:赛迪论坛    作者:guang

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

通过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); //释放字符串所占内存
阅读(184) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~