您现在的位置是: 软件 > 开发者网络 > 程序方舟 > 开发专栏 > C/C++开发 > 正文
·速成电脑精英(包分配)白领高薪一族从这里开始



-Java套接字编程(下)
-MediaStudio Pro 6.5教程
-三款卸载软件最新试用
-基于Visual C++的Winsock API研究

使用Microsoft Agent的COM接口编程
2002-03-27· · ··

上一页  1 2  

  进一步的编程要点

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

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

  BOOL IsValidAgentVersion(IAgent *pAgent) {
  IDispatch *pdAgent = NULL;
  ITypeInfo *pTypeInfo = NULL;
  ITypeLib *pTypeLib = NULL;
  TLIBATTR *pTypeLibAttr = NULL;
  BOOL bValid = FALSE;
  UINT uiIndex;
  pAgent->QueryInterface(IID—IDispatch, (LPVOID *)&pdAgent);
  pdAgent->GetTypeInfo(0, 0, &pTypeInfo); //取得类型信息
  pTypeInfo->GetContainingTypeLib(&pTypeLib, &uiIndex);//取得类型库
  pTypeLib->GetLibAttr(&pTypeLibAttr); //取得类型库中的属性
  if ((pTypeLibAttr->wMajorVerNum > AGENT—VERSION—MAJOR) ||((pTypeLibAttr->wMajorVerNum == AGENT—VERSION—MAJOR) &&(pTypeLibAttr->wMinorVerNum >= AGENT—VERSION—MINOR)))
  bValid = TRUE; //期望的版本号定义在AgtSvr.h文件中
  if (pTypeLib) {
  if (pTypeLibAttr) pTypeLib->ReleaseTLibAttr(pTypeLibAttr);
  pTypeLib->Release(); }
  if (pTypeInfo) pTypeInfo->Release();
  if (pdAgent) pdAgent->Release();
  return bValid;}

   2.实现IAgentNotifySink接口

  为了能够处理用户的输入,了解Agent对象的状态,客户程序应实现IAgentNotifySink接口来接收Agent对象的事件。IAgentNotifySink的声明和缺省实现可以在Platform SDK或Internet Clinet SDK中的Notify.h和Notify.cpp中找到,客户程序应根据需要修改某些事件的处理函数
。下面的代码向Agent对象注册IAgentNotifySink接口,其中AgentNotifySink是从IAgentNotifySink继承而来:

  pSink = new AgentNotifySink;
  pSink->AddRef(); //增加引用计数
  hRes = pAgent->Register((IUnknown *)pSink, &lNotifySinkID);//进行注册
  ...
  if (pSink) {
  pAgent->Unregister(lNotifySinkID); //注销IAgentNotifySink接口
  pSink->Release(); }

  客户程序最感兴趣的两个事件是RequestComplete和Command。Agent服务器采用异步方式来处理客户程序的各种请求,这样客户程序可以在请求服务的同时进行自己的工作,当服务器完成一项请求时就会激发RequestComplete事件,客户程序可以判断是哪一项请求已经结束,并做相应的处理。Command事件是当用户使用鼠标或麦克风向动画人物发出命令时激发的,客户程序可以通过IAgentUserInput接口来了解命令的具体信息。

   3.自定义命令

  Agent服务器为每个动画人物都提供了一些缺省的命令,这些命令出现在关联菜单或命令窗口中,客户程序可以通过IAgentCommands接口添加自定义命令。

  为了得到IAgentCommands的接口指针,应使用参数IID—IAgentCommands来调用IAgentCharacter::QueryInterface(),IAgentCommands的Add()或Insert()方法可以加入自定义命令,同时设置Caption、Visible和Voice属性,指明该命令是否显示出来,显示在关联菜单中还是在命令窗口中。

  Agent服务器为每个命令赋予一个ID值,客户程序可以使用这个ID值调用IAgentCommands::GetCommand()方法,得到每个命令的IAgentCommand接口指针,从而对单个命令的各种属性进行调整。

   4. WAV文件代替语音合成

  Microsoft Agent目前只支持英语的语音合成功能,要输出中文时只能用WAV文件来代替。如果给IAgentCharacter::Speak()方法的第二个参数传递一个WAV文件的路径,那么Agent服务器自动播放这个WAV文件,并在文字气球中显示出第一个参数中包含的文字,如果给第二个参数传递一个带音节信息的LWV文件的路径,则不需要在第一个参数中提供文字,因为LWV文件中包含有文字信息。当使用LWV文件时,动画人物的嘴部动作能与输出的语音保持一致,所以在可能的情况应该尽量使用LWV文件,这种格式的文件可用Microsoft Agent Linguistic Information Sound Editing Tool编辑WAV文件来生成。

   5.其它一些COM接口

  除了前面提到的接口外,Agent服务器还有其它一些COM接口。IAgentCommandWindow允许客户程序访问或设置命令窗口的属性,包括位置、大小和是否可见。IAgentSpeechInputProperties允许客户程序访问语音输入功能的属性,其中大部分属性都是只读的。IAgentAudioOutputProperties允许客户程序读取语音输出功能的部分属性。IAg
entPropertySheet允许客户程序访问或设置Agent服务器的属性表。IAgentBalloon允许客户程序访问文字气球的属性,可以设置少数属性,如是否可见和字体名称。关于这些接口的具体定义和用途请参考Microsoft Agent的帮助文档。

  总 结

  Microsoft Agent是一项较新的技术,它属于OLE的范畴,涉及较深的编程理论,本文所介绍的只是从OLE自动化服务角度出发的最基本的使用方法。

上一页  1 2  

■ 相关内容
 用VC进行COM编程所必须掌握的理论知识
 公寓间的线程调度问题
 COM组件中使用用户自定义数据类型
 用ATL建立轻量级的COM对象(八)
 在VC++6.0中用MFC进行COM编程
 用VC++实现矢量地图背景下的实时显示
 VC中如何改变对话框中控件的颜色
 ATL服务器:用VC++创建高性能的Web应用程序和XML Web服务
 在VC++中读写INI文件
 在VC++下实现高彩色工具条
 用VC实现桌面文字背景透明摆脱黑白
 在VC程序中加载GIF动画
 用VC++实现上网拨号功能
 VC++ 6.0下自制媒体播放器
 在VC下显示JPEG、GIF格式图像的一种简便方法
 用VC++编写扫雷游戏
 用VC自制 “彩票选号器”
感谢 访问天极网,如果您觉得该文章涉及版权问题,请看这里!