Mengakses Layanan Menggunakan Java

[Microsoft Agent tidak digunakan lagi pada Windows 7, dan mungkin tidak tersedia dalam versi Windows berikutnya.]

Anda juga dapat mengakses layanan Agen Microsoft dari applet Java. Banyak fungsi yang dapat diakses melalui antarmuka Agen Microsoft mengembalikan nilai melalui parameter yang diteruskan oleh referensi. Untuk meneruskan parameter ini dari Java, perlu untuk membuat array elemen tunggal dalam kode Anda dan meneruskannya sebagai parameter ke fungsi yang sesuai. Jika Anda menggunakan Microsoft Visual J++ dan telah menjalankan Wizard Pustaka Jenis Java di server Agen Microsoft, lihat file summary.txt untuk meninjau fungsi mana yang memerlukan argumen array. Prosedur ini mirip dengan yang ada di C; Anda menggunakan antarmuka IAgentEx untuk membuat instans server, lalu memuat karakter:

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);
      }

Prosedur ini sedikit berbeda saat memuat karakter dari lokasi jarak jauh HTTP seperti situs web. Dalam hal ini, metode Muat bersifat asinkron dan akan menaikkan pengecualian COM terhadap E_PENDING (0x8000000a). Anda harus menangkap pengecualian ini dan menanganinya dengan benar seperti yang dilakukan dalam fungsi berikut:

// 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

   .
   .
   .
}

Kemudian dapatkan antarmuka IAgentCharacterEx yang memungkinkan Anda mengakses metodenya:

// 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);

Demikian pula, untuk diberi tahu tentang peristiwa, Anda harus mengimplementasikan IAgentNotifySink atau antarmuka IAgentNotifySinkEx , membuat dan mendaftarkan objek jenis tersebut:

...
// 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]);
   ...
   }

Untuk mengakses Agen Microsoft dari applet Java, Anda harus membuat kelas Java yang Anda instal dengan applet. Anda dapat menggunakan Wizard Pustaka Tipe Java Visual J++, misalnya, untuk menghasilkan file-file ini. Jika Anda berencana untuk menghosting applet di halaman web, Anda harus membangun Java CAB yang ditandatangani termasuk file kelas yang dihasilkan yang diunduh dengan halaman. File kelas diperlukan untuk mengakses Microsoft Agent Server karena merupakan objek COM, yang dijalankan di luar kotak pasir Java.