標準および拡張インターフェースの考慮事項
特定のプラットフォーム上の標準と拡張の 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
...