Udostępnij za pośrednictwem


Uzyskiwanie dostępu do usług przy użyciu języka Java

[Program Microsoft Agent jest przestarzały w systemie Windows 7 i może być niedostępny w kolejnych wersjach systemu Windows.

Dostęp do usług programu Microsoft Agent można również uzyskać za pomocą apletu Java. Wiele funkcji dostępnych za pośrednictwem interfejsów programu Microsoft Agent zwraca wartości za pośrednictwem parametrów przekazywanych przez odwołanie. Aby przekazać te parametry z języka Java, należy utworzyć tablice z jednym elementem w kodzie i przekazać je jako parametry do odpowiedniej funkcji. Jeśli używasz programu Microsoft Visual J++ i uruchomiłeś Kreatora Biblioteki Typów Java na serwerze programu Microsoft Agent, sprawdź plik summary.txt, aby zobaczyć, które funkcje wymagają argumentów tablicowych. Procedura jest podobna do tej w C; interfejsu IAgentEx używa się do tworzenia wystąpienia serwera, a następnie ładowania postaci.

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

Procedura jest nieco inna podczas ładowania znaków z lokalizacji zdalnej HTTP, takiej jak witryna internetowa. W tym przypadku metoda Load jest asynchroniczna i zgłosi wyjątek COM E_PENDING (0x8000000a). Należy przechwycić ten wyjątek i obsłużyć go poprawnie, tak jak to jest robione w następujących funkcjach:

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

   .
   .
   .
}

Następnie uzyskaj interfejs IAgentCharacterEx, który umożliwia dostęp do jego metod:

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

Podobnie aby otrzymywać powiadomienia o zdarzeniach, należy zaimplementować IAgentNotifySink lub interfejs IAgentNotifySinkEx IAgentNotifySinkEx, tworząc i rejestrując obiekt tego typu:

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

Aby uzyskać dostęp do programu Microsoft Agent z apletu Java, należy wygenerować klasy języka Java instalowane za pomocą apletu. Możesz na przykład użyć Kreatora biblioteki typów języka Java visual J++, aby wygenerować te pliki. Jeśli planujesz hostować aplet na stronie internetowej, musisz utworzyć podpisany plik CAB języka Java zawierający wygenerowane pliki klas, które pobierają ze stroną. Pliki klas są niezbędne do uzyskania dostępu do programu Microsoft Agent Server, ponieważ jest to obiekt COM, który jest wykonywany poza piaskownicą Języka Java.