Z and I Emulator for Windows ホスト画面での部分的な EHLLAPI 入力

問題
HCL Z and I Emulator for Windowsの使用時に、 切り捨てられたコマンド・テキストがホストに送信された。
原因

EHLLAPI アプリケーションが SYSREQ キーをホストに送信し、 その後にホスト画面にコマンドを入力しようとした場合、そのコマンドの一部だけが ホストに送られる場合があります。この問題の原因は、Z and I Emulator for Windowsのホスト側での SYSREQ 処理と、EHLLAPI アプリケーションからのコマンド入力との同期が取れていないことです。

アプリケーションからホストに SYSREQ コマンドが送信されると、以下の状況が発生します。
  • SSCP-LU セッションにいることを示すように、OIA が更新される。
  • Z and I Emulator for Windows セッションが AO コマンド (SYSREQ) を 3270 ホストに送信する。

ホストは、SYSREQ を受信するとすぐに、0x15 コード、つまり NL (NewLine) で Z and I Emulator for Windows に応答します。Z and I Emulator for Windows は、 この NL コマンドについて、行の残りの部分をヌルで埋め、 カーソルを次行の先頭に移動するという処理を行います。

Z and I Emulator for Windows セッションがホストから NL コマンドを受信して処理を終える前であるのに、EHLLAPI アプリケーションがホスト画面に (SendKeys 機能を介して) さまざまなコマンドを入力し続けると、問題が起こります。結果として、 入力コマンドの一部がまず画面に入力され、その間に NL コマンドが処理されて カーソルが次の行に移動します。次に、コマンドの残りの部分が次行で入力されます。したがって、 切り捨てられた 2 番目のコマンド部分のみがホストに送信されることになり、誤った結果となります。

解決方法
この問題の解決策は、EHLLAPI アプリケーションに、NL コマンドの受信と処理の完了を待たせ、 その後でホスト画面へのコマンドの入力を継続させるようにすることです。SYSREQ のホスト応答が処理されたことがセッションから EHLLAPI アプリケーションに通知されると、その EHLLAPI アプリケーションは入力を 続行できます (これは、この時点でセッションが新規入力を受け入れるための正しい状態になっているためです) 。これを実現するには、次の EHLLAPI 関数呼び出しを使用します。
Start_Host_Notification (23)
Pause (18)
Set_Session_Parameters (9)
Query_Host_Update (24).
EHLLAPI アプリケーション中のコードには、以下のようなものがあり得ます。
  • Sendkeys(@A@H) の呼び出し。これは、SYSREQ コマンドをセッションに送信します。
  • B を指定した StartHostNotify の呼び出し。 ここで、 B は OIA と PS の両方の通知を指示します。これは、セッションの OIA または PS、あるいはその両方が ホストによって更新されたときに EHLLAPI アプリケーションに通知するよう、セッションに指示します。
  • 十分なタイムアウト期間を指定した Pause の呼び出し。これにより、EHLLAPI アプリケーションは、 セッションの OIA または PS、あるいはその両方がホストによって更新されたと セッションから通知されるまで待つようになります。これは、 SYSREQ コマンドに対する、最も長く待たれているホスト応答を、 セッションが受け取るときに起こります。タイムアウト値を超えた場合で、 ホスト通知をまだ何も受信していない場合でも、Pause 機能呼び出しは戻ることに注意してください。

また、この Pause 呼び出しが機能するためには、Set_Session_Parameters (9) 機能呼び出し を使用して IPAUSE オプションを使用可能化する必要があります。これが必要な理由は、 これによって Pause API 呼び出しは、 ホストが OIA または PS、あるいはその両方の更新をセッションに通知したときには戻るようにと指示されるからです。

OIA/PS 更新 (ホスト通知) があったために Pause が戻った場合、 その戻りコードは 26 です。この場合、ホスト・コマンドを送信できる状態になっています。これ以外の場合、 もう一度ホスト応答を待つ必要があります。

EHLLAPI アプリケーションは、OIA または表示スペース (あるいはその両方) がホストによって更新されたことを知ると、 コマンドを継続できます。更新内容を検査するために、QueryHostUpdate が使用されます。更新内容を検査するために、QueryHostUpdate が使用されます。 つまり、OIA のみが更新された (戻りコード 21) のか、PS のみが更新された (戻りコード 22) のか、 それとも OIA と PS の両方が更新された (戻りコード 23) のかの検査です。

例えば、EHLLAPI コードは次の部分のようになります。
Send Keys(@A@H) /* Send SYSREQ command to the host */

Start Host Notification with 'B' in byte 2 /* Enable notification to EHLLAPI application
                                              when session's OIA and/or PS are updated */

Set Session Parms with IPAUSE option /* Allow Pause to be interrupted */

Label WW:

Pause for 15 seconds /* 15 secs is a sample time-out value */

retVal = Query Host Update /* Store return value of QueryHostUpdate() into retVal */

If (retVal = 21 or 22 or 23) /* OIA and/or PS was updated */

Send Keys("Your Input Command to host") /* Send input command to host */

else

goto (Label WW)

Stop Host Notification /* Disable host notification */ 

上記コードは、この問題の最適の解決策となります。 この EHLLAPI アプリケーションは、セッションが SYSREQ ホスト応答を受信して処理できるのに必要最低限の時間だけ待ち、 その後にコマンド入力を送信します。

別の解決策は、EHLLAPI アプリケーションで、SYSREQ コマンドと それに続くコマンドとの間に遅延 [例えば、Sleep(1000)] を追加することです。 これにより、セッションはホスト応答を受信して処理するのに十分な 時間を持つことになります。ただし、この解決策は、最適のものではありません。 なぜなら、遅延が短すぎたり、長すぎたりする可能性があるからです。

3270 SYSREQ 機能について 詳しくは、RFC 2355 (TN3270 拡張) を参照してください。