Red de conocimiento informático - Material del sitio web - Cómo usar C para implementar código para que los animales se muevan en la pantalla

Cómo usar C para implementar código para que los animales se muevan en la pantalla

El uso del control del agente puede lograr exactamente el mismo efecto que Kaká Assistant.

Microsoft Agent es bastante versátil, podemos agregarlo a aplicaciones normales para uso del sistema local, o incrustarlo en documentos HTML para uso en Internet/Intranet. Microsoft Agent admite lenguajes de programación como C/C, Visual Basic, Java, JScript y VBScript. Microsoft Agent admite lenguajes de programación como C/C, Visual Basic, Java, JScript y VBScript, y proporciona a los programadores dos métodos de programación: servidor de automatización OLE y control ActiveX. En esencia, ambos métodos de programación pertenecen a la tecnología OLE. Todas las categorías se basan en COM (modelo de objetos componentes). Los controles ActiveX se pueden llamar fácilmente utilizando herramientas de programación que admiten ActiveX, como la biblioteca de clases VC MFC o VB. Sin embargo, los controles ActiveX ocultan muchos detalles técnicos OLE. Si queremos profundizar nuestra comprensión de un determinado objeto COM, debemos usar COM directamente. Programación de interfaz, desde esta perspectiva, este artículo presentará lo siguiente. A partir de este punto, este artículo presentará el método de programación básico de la interfaz COM de Microsoft Agent, con la esperanza de servir como punto de partida.

Conocimientos básicos de programación OLE

Los primeros OLE (ahora conocido como OLE 1) aparecieron por primera vez en Windows 3.1. Su objetivo principal es generar documentos compuestos para que un documento de aplicación pueda contener datos. de otras aplicaciones (objetos) de forma encadenada o incrustada. A medida que la tecnología de componentes de software se vuelve cada vez más importante, Microsoft diseñó OLE 2 basado en OLE 1 para implementar componentes de software reutilizables a nivel binario y hacer que sea muy fácil controlar las versiones de estos componentes y ampliar su funcionalidad. Debido a que la arquitectura de OLE 2 fue diseñada para ser abierta y extensible, no habrá OLE 3 o 4. Después de años de desarrollo, OLE ha incluido muchas tecnologías, como OLE Automation, COM, COM, DCOM y ActiveX, que son ActiveDirectory (una tecnología clave que se utilizará en NT 5.0), OLE Messaging, DirectX y OLE 2, y OLE 1, OLE 2, OLE 3 y OLE 4. Con la ayuda de mensajería OLE, DirectX, controles activos, secuencias de comandos ActiveX y programador de tareas, y muchas otras tecnologías nuevas, OLE ya no es una abreviatura de vinculación e incrustación de objetos, se ha convertido en una palabra separada específicamente para OLE ya no es una abreviatura de Vinculación e incrustación de objetos, se ha convertido en una palabra separada y se usa exclusivamente para la tecnología de integración de componentes de software de Microsoft.

COM es la base de la tecnología OLE. Especifica el método de comunicación entre objetos. Los objetos que cumplen con la especificación COM también se denominan objetos COM. Según las disposiciones de COM, los objetos pueden escribirse internamente en cualquier idioma y se comunican con el mundo exterior a través de interfaces. La llamada interfaz es un conjunto de llamadas a funciones específicas (métodos) proporcionadas por un objeto. Cada objeto puede tener múltiples interfaces. Se pueden implementar diferentes objetos con la misma interfaz. .

Dado que OLE proporciona componentes reutilizables a nivel binario, el programa cliente no puede acceder directamente a los datos dentro del objeto, y la lectura o configuración de las propiedades del objeto también se realiza a través de la interfaz. Cada interfaz hereda de una interfaz llamada IUnknown y debe volver a implementar los tres métodos de IUnknown: QueryInterface, AddRef y Release. El programa cliente llama a QueryInterface para obtener otros punteros de interfaz del objeto AddRef y Release, respectivamente. El recuento de referencias de la liberación se incrementa y disminuye en uno, y el objeto se libera cuando el recuento de referencias llega a cero. Los pasos generales para que un programa cliente llame a un objeto COM son: primero crear el objeto, luego obtener el puntero de interfaz requerido, llamar a la función correspondiente y finalmente liberar el puntero de interfaz y el objeto.

El método básico para llamar a Microsoft Agent desde el programa C

Basándonos en los conocimientos básicos introducidos anteriormente, echemos un vistazo a cómo llamar a Microsoft Agent desde el programa C.

1. Configuraciones y opciones

La herramienta de programación utilizada en este artículo es Visual C 5.0.0 para aplicaciones generales Win32, con el fin de permitir que el programa se compile, se conecte y se ejecute. Normalmente, primero necesita tener AgtSvr.h y AgtSvr-i.c, dos archivos que definen la interfaz COM de Microsoft Agent. Se pueden encontrar en el sitio MS Agent de Microsoft (/).workshop/

rog/agent. /) o descargue el último SDK de cliente de Internet o SDK de plataforma de Microsoft. En segundo lugar, agregue las siguientes bibliotecas en el menú Proyecto/Configuración/Enlace: oleaut32.lib, oleaut32.lib, uuid.lib, odbc32.lib odbccp32.lib y, finalmente, asegúrese de que el agente Microsoft y los datos de los personajes de animación estén instalados en su sistema.

2. Cree un objeto Microsoft Agent

Antes de crear un objeto OLE, OLE debe inicializarse mediante la función OleInitialize (). Si la inicialización de OLE no tiene éxito, los siguientes pasos no se pueden continuar Código, la creación de objetos se completa con la función CoCreateInstance ():

if (FAILED(OleInitialize(NULL)) return -1; //inicializar OLE

hRes = CoCreateInstance(CLSID- AgentServer, NULL, CLSCTX-SERVER, IID-IAgent, (LPVOID *)pAgent); //crea una instancia de Microsoft Agent Server

if (FAILED(hRes)) return -1;

El primer parámetro de CoCreateInstance() es el CLSID (código de clase) del objeto. El CLSID de Microsoft Agent Server es AgtSvr-i. El segundo parámetro generalmente se establece en NULL; El parámetro se utiliza para especificar el funcionamiento del objeto, como remoto o local, aquí se establece en CLSCTX SERVER; el cuarto parámetro especifica la ID de la interfaz utilizada para comunicarse con el objeto, que también es la codificación de 128 bits. el ID de la interfaz es IID-IAgent; el quinto parámetro se utiliza para recibir IAgent.

CoCreateInstance() iniciará el servidor Microsoft Agent si el servidor aún no se está ejecutando en la memoria, creará un objeto Agente; el servidor ya se está ejecutando, se conectará al servidor y creará un objeto Agente. Cuando se liberen todos los objetos Agente, el servidor saldrá automáticamente

3. Cargue datos de personajes animados

<. p> El siguiente código llama al método IAgent: Load() para cargar datos de personajes animados.

Dado que el servidor del Agente se ejecuta en su propio espacio de memoria, necesita usar SysAllocString() para asignar memoria para la variable de cadena transferida:

VariantInit(vPath //inicializa la variable OLE

<); p > vPath.vt = VT-BSTR; // especifica que el tipo de variable es una cadena Unicode

vPath.bstrVal=SysAllocString( kpwszCharacter);

/kpwszCharacter almacena datos de caracteres de animación path

hRes = pAgent-gt; Load(vPath, lCharID, lRequestID); //Cargar datos, el ID del carácter se devolverá en lCharID

hRes = pAgent-gt; GetCharacter(lCharID, pdCharacter);

//Obtiene el puntero de la interfaz IDispatch para lCharID llamando al método IDispatch:: QueryInterface() obtiene //El puntero de la interfaz de IAgentCharacter:

hRes = pdCharacter-gt; QueryInterface(IID- IAgentCharacter, (LPVOID *)pCharacter);

pdCharacter-gt; Release(); Liberar IDispath

IAgentCharacter La interfaz le permite llamar a varios métodos compatibles con personajes animados:

hRes = pCharacter-gt; Show(FALSE, lRequestID); / Mostrar personajes animados

hRes = pCharacter-gt; (320, 240, 100, lRequestID); //Mueve el personaje animado al centro de la pantalla

bszSpeak = SysAllocString(L "¡Hola mundo!" Speak(bszSpeak, NULL, lRequestID); // Deja que el personaje animado hable

SysFreeString(bszSpeak); //Libera la memoria ocupada por la cadena

4. Libera el objeto

El programa necesita liberarse. el objeto Agente creado antes de salir:

if (pCharacter) {

pCharacter-gt() //Libera la interfaz IAgentCharacter

pAgent-gt; ; Unload(lCharID); / /Descargar datos de caracteres de animación

}

pAgent-gt; //Liberar objeto del agente

VariantClear(vPath); ); //Borrar variables OLE

Otros puntos de programación

La sección anterior presentó algunos de los pasos más básicos para llamar al servidor Microsoft Agent. Para completar tareas más prácticas, el programa cliente también debe considerar los siguientes puntos de programación de acuerdo con su propia situación.

1. Verifique la versión del servidor del Agente

OLE requiere que los componentes u objetos tengan compatibilidad con versiones anteriores. Una versión superior del objeto admite todas las interfaces y propiedades de una versión inferior del mismo. objeto de facilitar las actualizaciones de los componentes. El programa cliente normalmente debería verificar la versión del objeto y llamarlo solo si el número de versión del objeto instalado en el sistema es mayor o igual al número de versión requerido. La siguiente función IsValidAgentVersion() verificará el número de versión de Microsoft Agent y lo comparará con el número de versión definido en el archivo AgtSvr.h:

BOOL IsValidAgentVersion(IAgent *pAgent) {

IDispatch *pdAgent = NULL;

ITypeInfo *pTypeInfo = NULL;

ITypeLib *pTypeLib = NULL

TLIBATTR *pTypeLibAttr = NULL; >

BOOL bValid = FALSE;

UINT uiIndex;

pAgent-gt; QueryInterface(IID-IDispatch, (LPVOID *)pdAgent); pdAgent-gt; GetTypeInfo(0, 0, pTypeInfo); //obtener información de tipos

pTypeInfo-gt; GetContainingTypeLib(pTypeLib, uiIndex); -gt; GetLibAttr(pTypeLibAttr); //obtiene los atributos en la biblioteca de tipos

if ((pTypeLibAttr-gt; wMajorVerNum gt; AGENT-VERSION-MAJOR) ?((pTypeLibAttr-gt; wMajorVerNum == AGENT-VERSION-MAJOR) (pTypeLibAttr-gt; wMinorVerNum gt; = AGENT-VERSION-MINOR)))

bValid = TRUE; // El número de versión deseado se define en el archivo AgtSvr.h.

if (pTypeLib) {

if (pTypeLibAttr) pTypeLib-gt; ReleaseTLibAttr(pTypeLibAttr);

pTypeLib-gt; p>

p>

if (pTypeInfo) pTypeInfo-gt;

if (pdAgent) pdAgent-gt(); }

2. Implementar la interfaz IAgentNotifySink

Para poder procesar la entrada del usuario y comprender el estado del objeto Agente, el programa cliente debe implementar la interfaz IAgentNotifySink para recibir. eventos del objeto Agente.

La declaración y la implementación predeterminada de IAgentNotifySink se pueden encontrar en Notify.h y Notify.cpp en Platform SDK o Internet Clinet SDK. El programa cliente debe modificar las funciones del controlador de ciertos eventos según sea necesario

. El siguiente código registra la interfaz IAgentNotifySink en el objeto Agente, donde AgentNotifySink hereda de IAgentNotifySink:

pSink = new AgentNotifySink

pSink -gt(); count

p>

hRes = pAgent-gt; Register((IUnknown *)pSink, lNotifySinkID); //realiza el registro

...

if (pSink) {

pAgent-gt; Unregister(lNotifySinkID); //Anular el registro de la interfaz IAgentNotifySink

El servidor pSink-gt.Agent utiliza métodos asincrónicos para manejar varias solicitudes del cliente. programa, para que el cliente El programa pueda completar su trabajo mientras solicita servicios.

Cuando el servidor completa una solicitud, activa el evento RequestComplete, que permite al programa cliente determinar qué solicitud se ha completado y manejarla en consecuencia. Cuando el usuario usa el mouse o el micrófono para enviar un comando al personaje animado, se activa el evento Comando y el programa cliente puede usar la interfaz IAgentUserInput para conocer la información específica del comando.

3. Comandos personalizados

El servidor del Agente proporciona algunos comandos predeterminados para cada personaje animado. Estos comandos se mostrarán en el menú o ventana de comandos correspondiente, y el programa cliente puede agregarlos personalizados. comandos a la interfaz IAgentCommands.

Para obtener un puntero a la interfaz IAgentCommands, llame a IAgentCharacter::QueryInterface() e ingrese el parámetro IID-IAgentCommands, luego llame al método Add() o Insert() de IAgentCommands, y podrá agregar información personalizada. comandos y establece las propiedades de título, visible y de sonido para indicar si el comando aparece en un menú contextual o en una ventana de comandos.

El servidor del Agente asigna un valor de ID a cada comando, y el programa cliente puede usar el valor de ID para llamar al método IAgentCommands::GetCommand() para obtener un puntero a la interfaz IAgentCommand de cada comando, de esta manera ajustando una sola Varias propiedades del comando.

4. Utilice archivos WAV en lugar de síntesis de voz

Microsoft Agent actualmente solo admite síntesis de voz en inglés, por lo que solo puede usar archivos WAV para reemplazar la salida en chino. Si pasa la ruta a un archivo WAV como segundo argumento del método IAgentCharacter::Speak(), el servidor del Agente reproducirá automáticamente el archivo WAV y mostrará el texto contenido en el primer argumento en un globo de texto. Si pasa la ruta a un archivo LWV que contiene información de sílabas como segundo parámetro, no necesita proporcionar texto en el primer parámetro porque el archivo LWV contiene información de texto.

Cuando se utilizan archivos LWV, los movimientos de la boca de los personajes animados pueden ser consistentes con el discurso de salida, por lo que se deben usar archivos LWV siempre que sea posible. Este formato se puede generar editando archivos WAV utilizando la herramienta de edición de sonido Microsoft Agent Language Information.

5. Algunas otras interfaces COM

Además de las interfaces mencionadas anteriormente, el servidor del Agente también tiene otras interfaces COM. IAgentCommandWindow permite que un programa cliente acceda o establezca las propiedades de una ventana de comandos, incluida su posición, tamaño y si es visible. IAgentAudioOutputProperties permite a los programas cliente leer algunas propiedades de la función de salida de voz. IAgentPropertySheet Permite que un programa cliente acceda o configure la hoja de propiedades del servidor del agente. Para definiciones y usos específicos de estas interfaces, consulte la documentación de ayuda del agente de Microsoft.