Accès aux services à l’aide de Java
[Microsoft Agent est déconseillé à partir de Windows 7 et peut ne pas être disponible dans les versions ultérieures de Windows.]
Vous pouvez également accéder aux services de Microsoft Agent à partir d’une applet Java. La plupart des fonctions accessibles via les interfaces Microsoft Agent retournent des valeurs par le biais de paramètres passés par référence. Pour passer ces paramètres à partir de Java, il est nécessaire de créer des tableaux à élément unique dans votre code et de les passer en tant que paramètres à la fonction appropriée. Si vous utilisez Microsoft Visual J++ et que vous avez exécuté l’Assistant Bibliothèque de types Java sur le serveur Microsoft Agent, reportez-vous au fichier summary.txt pour examiner les fonctions qui nécessitent des arguments de tableau. La procédure est similaire à celle en C ; vous utilisez l’interface IAgentEx pour créer un instance du serveur, puis charger le caractère :
private IAgentEx m_AgentEx = null;
private IAgentCharacterEx m_Merlin[] = {null};
private int m_MerlinID[] = {-1};
private int m_RequestID[] = {0};
private final String m_CharacterPath = "merlin.acs";
public void start()
{
// Start the Microsoft Agent Server
m_AgentEx = (IAgentEx) new AgentServer();
try
{
Variant characterPath = new Variant();
characterPath.putString(m_CharacterPath);
// Load the character
m_AgentEx.Load(characterPath,
m_MerlinID,
m_RequestID);
}
La procédure est légèrement différente lors du chargement de caractères à partir d’un emplacement distant HTTP tel qu’un site web. Dans ce cas, la méthode Load est asynchrone et déclenche une exception COM de E_PENDING (0x8000000a). Vous devez intercepter cette exception et la gérer correctement, comme cela est fait dans les fonctions suivantes :
// Constants used in asynchronous character loads
private final int E_PENDING = 0x8000000a;
private final int NOERROR = 0;
// This function loads a character from the specified path.
// It correctly handles the loading of characters from
// remote sites.
// This sample doesn't care about the request id returned
// from the Load call. Real production code might use the
// request id and the RequestComplete callback to check for
// a successful character load before proceeding.
public int LoadCharacter(Variant path, int[] id)
{
int requestid[] = {-1};
int hRes = 0;
try
{
// Load the character
m_AgentEx.Load(path, id, requestid);
}
catch(com.ms.com.ComException e)
{
// Get the HRESULT
hRes = e.getHResult();
// If the error code is E_PENDING, we return NOERROR
if (hRes == E_PENDING)
hRes = NOERROR;
}
return hRes;
}
public void start()
{
if (LoadCharacter(characterPath, m_MerlinID) != NOERROR)
{
stop();
return;
}
// Other initialization code here
.
.
.
}
Obtenez ensuite l’interface IAgentCharacterEx qui vous permet d’accéder à ses méthodes :
// Get the IAgentCharacterEx interface for the loaded
// character by passing its ID to the Agent server.
m_AgentEx.GetCharacterEx(m_MerlinID[0], m_Merlin);
// Show the character
m_Merlin[0].Show(FALSE, m_RequestID);
// And speak hello
m_Merlin[0].Speak("Hello World!", "", m_RequestID);
De même, pour être informé des événements, vous devez implémenter l’interface IAgentNotifySink ou IAgentNotifySinkEx , en créant et en inscrivant un objet de ce type :
...
// Declare an Agent Notify Sink so that we can get
// notification callbacks from the Agent server.
private AgentNotifySinkEx m_SinkEx = null;
private int m_SinkID[] = {-1};
public void start()
{
...
// Create and register a notify sink
m_SinkEx = new AgentNotifySinkEx();
m_AgentEx.Register(m_SinkEx, m_SinkID);
…
// Give our notify sink access to the character
m_SinkEx.SetCharacter(m_Merlin[0]);
...
}
Pour accéder à Microsoft Agent à partir d’une applet Java, vous devez générer des classes Java que vous installez avec l’applet. Vous pouvez utiliser l’Assistant Bibliothèque de types Java Visual J++, par exemple, pour générer ces fichiers. Si vous envisagez d’héberger l’applet sur une page web, vous devez générer un CAB Java signé incluant les fichiers de classe générés qui se téléchargent avec la page. Les fichiers de classe sont nécessaires pour accéder au serveur Microsoft Agent, car il s’agit d’un objet COM qui s’exécute en dehors du bac à sable Java.