扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
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); //释放字符串所占内存 |
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者