Java Kullanarak Hizmetlere Erişme

[Microsoft Agent, Windows 7 itibariyle kullanım dışıdır ve sonraki Windows sürümlerinde kullanılamayabilir.]

Microsoft Agent hizmetlerine bir Java uygulamasından da erişebilirsiniz. Microsoft Agent arabirimleri aracılığıyla erişilebilen işlevlerin çoğu, referansla geçirilen parametreler aracılığıyla değerleri döndürür. Bu parametreleri Java'dan geçirmek için kodunuzda tek öğeli diziler oluşturmanız ve bunları uygun işleve parametre olarak geçirmeniz gerekir. Microsoft Visual J++ kullanıyorsanız ve Microsoft Agent sunucusunda Java Tür Kitaplığı Sihirbazı'nı çalıştırdıysanız, dizi bağımsız değişkenlerini gerektiren işlevleri gözden geçirmek için summary.txt dosyasına bakın. Yordam C'dekine benzer; IAgentEx arabirimini kullanarak sunucunun bir örneğini oluşturur ve ardından karakteri yüklersiniz:

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

HTTP üzerinden erişilen uzak bir konumdan, örneğin bir web sitesinden, karakterler yüklenirken prosedür biraz farklıdır. Bu durumda Load yöntemi zaman uyumsuzdur ve E_PENDING (0x8000000a) için COM özel durumu oluşturur. Bu özel durumu yakalamanız ve aşağıdaki işlevlerde olduğu gibi doğru şekilde işlemeniz gerekir:

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

   .
   .
   .
}

Ardından yöntemlerine erişmenizi sağlayan IAgentCharacterEx arabirimini edinin:

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

Benzer şekilde, olayların bildirilmesi için IAgentNotifySink veya IAgentNotifySinkEx arabirimini uygulamanız ve bu tür bir nesne oluşturmanız ve kaydetmeniz gerekir:

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

Bir Java uygulamasından Microsoft Agent'a erişmek için, uygulamayla yüklediğiniz Java sınıfları oluşturmanız gerekir. Örneğin, bu dosyaları oluşturmak için Visual J++ Java Tür Kitaplığı Sihirbazı'nı kullanabilirsiniz. Uygulamayı bir web sayfasında barındırmayı planlıyorsanız, sayfayla birlikte indirilen oluşturulan sınıf dosyaları dahil olmak üzere imzalı bir Java CAB oluşturmanız gerekir. Sınıf dosyaları, Java korumalı alanının dışında yürütülen bir COM nesnesi olduğundan Microsoft Agent Server'a erişmek için gereklidir.