Java を使用したサービスへのアクセス
[Microsoft エージェントは Windows 7 の時点で非推奨となり、以降のバージョンの Windows では使用できない場合があります。]
Java アプレットから Microsoft エージェント サービスにアクセスすることもできます。 Microsoft エージェント インターフェイスを介してアクセスできる関数の多くは、参照渡しされたパラメーターを介して値を返します。 これらのパラメーターを Java から渡すには、コードに単一要素配列を作成し、パラメーターとして適切な関数に渡す必要があります。 Microsoft Visual J++ を使用していて、Microsoft エージェント サーバーで Java タイプ ライブラリ ウィザードを実行している場合は、summary.txt ファイルを参照して、配列引数を必要とする関数を確認してください。 この手順は C の手順と似ています。 IAgentEx インターフェイスを使用してサーバーのインスタンスを作成し、文字を読み込みます。
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);
}
Web サイトなどの HTTP リモートの場所から文字を読み込む場合、手順は少し異なります。 この場合、 Load メソッドは非同期であり、E_PENDING (0x8000000a) の COM 例外を発生させます。 この例外をキャッチし、次の関数で行われるように正しく処理する必要があります。
// 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
.
.
.
}
次に、メソッドにアクセスできる IAgentCharacterEx インターフェイスを取得します。
// 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);
同様に、イベントを通知するには、 IAgentNotifySink インターフェイスまたは IAgentNotifySinkEx インターフェイスを実装し、その型のオブジェクトを作成して登録する必要があります。
...
// 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]);
...
}
Java アプレットから Microsoft エージェントにアクセスするには、アプレットと共にインストールする Java クラスを生成する必要があります。 たとえば、Visual J++ Java タイプ ライブラリ ウィザードを使用して、これらのファイルを生成できます。 Web ページでアプレットをホストする予定の場合は、ページと共にダウンロードする生成されたクラス ファイルを含む署名付き Java CAB を構築する必要があります。 クラス ファイルは、Java サンドボックスの外部で実行される COM オブジェクトであるため、Microsoft エージェント サーバーにアクセスするために必要です。