標準および拡張インターフェースの考慮事項

特定のプラットフォーム上の標準と拡張の EHLLAPI インターフェースの間 に機能上の相違はありません。しかし、他の面で重要な違いがあります。
  • 拡張 EHLLAPI インターフェースは、表示スペース ID (PSID) を 1 バイトから 4 バイトに拡張します。現時点では追加バイトは使用されませんが、今後出されるバージョンの 拡張 EHLLAPI との互換性を確実にするために、ご使用のアプリケーションで 追加バイトを 2 進ゼロに設定してください。
  • EHLLAPI 関数との間で受け渡されるメモリー・バッファー内の データ・エレメントの位置 (オフセット) が異なります。拡張 EHLLAPI のデータ・エレメントは、ダブルワード境界に位置合わせされます。標準 EHLLAPI のデータ・エレメントは、特定の方法で位置合わせされることはありません。EHLLAPI アプリケーションをコード化して、オフセット (バイト) 値によって バッファー内のデータを設定したり、あるいは取り出したりすることはできません。代わりに、HAPI_C.H ファイルで提供されるデータ構造を使用して、 データ・エレメントを設定したり、取り出したりすることができます。これにより、16 ビットと 32 ビットの両方のプログラムについて、 正しい位置からデータを設定したり、取り出したりすることが保証されます。
EHLLAPI データ・バッファーを 2 進ゼロで事前に埋めて、HAPI_C.H で提供される データ構造を使用すると、ソース・コードを変更することなく、標準または拡張で 稼働するようにアプリケーションをコンパイルすることができます。例えば、次のセクションのコードは、標準 EHLLAPI に対して機能しますが、 拡張 EHLLAPI に対しては機能しません。
   #include "hapi_c.h"
   ...
   int Func, Len, Rc;
   char Buff[18];
   char SessType;
 
   Func = HA_QUERY_SESSION_STATUS;   // Function
   Len  = 18;                        // Buffer length
   Rc   = 0;
   Buff[0] = 'A'                     // Session to query
   hllapi(&Func, Buff, &Len, &Rc);   // Execute function
 
   SessType = Buff[9];               // Get session type
   ...
上記の例は、拡張 EHLLAPI アプリケーションとしてコンパイルした場合は 機能しません。その理由は次のとおりです。
  • このアプリケーションは、拡張セッション ID バイトをゼロに設定していません。
  • この関数のバッファー長は、18 ではなく、20 です。
  • セッション・タイプ標識は、データ・バッファー内のオフセット 9 ではなく、 オフセット 12 です。
同じ関数を、標準または拡張オペレーションでコンパイルした場合に、正し く機能するように書いたものを以下に示します。変更された行は、 > で示しています。
   #include "hapi_c.h"
   ...
   int Func, Len, Rc;
>  struct HLDQuerySessionStatus Buff;
   char SessType;
 
   Func = HA_QUERY_SESSION_STATUS;   // Function
>  Len  = sizeof(Buff);              // Buffer length
   Rc   = 0;
>  memset(&Buff, 0x00, sizeof(Buff));// Zero buffer
>  Buff.qsst_shortname = 'A';        // Session to query
   hllapi(&Func, (char *)&Buff, &Len, &Rc);   // Execute function
 
>  SessType = Buff.qsst_sestype;     // Get session type
   ...