标准和增强接口注意事项

给定平台上的标准和增强 EHLLAPI 接口之间没有功能差异。但是,有其他重要区别:
  • 增强 EHLLAPI 接口将表示空间标识 (PSID) 从 1 字节扩展到 4 字节。当前未使用其他字节,但应用程序应将其设置为二进制零,以确保与增强 EHLLAPI 的未来版本兼容。
  • 传入和传出 EHLLAPI 功能的内存缓冲区中数据元素的位置(偏移量)不同。增强 EHLLAPI 中的数据元素与双字边界对齐。标准 EHLLAPI 中的数据元素不会以任何特定方式对齐。不应对 EHLLAPI 应用程序进行编码,以便通过偏移量(字节)值设置或检索缓冲区中的数据。相反,应该使用 HAPI_C.H 文件中提供的数据结构来设置和检索数据元素。这将确保从 16 位和 32 位程序的正确位置设置和检索数据。
通过在 EHLLAPI 数据缓冲区中预先填充二进制零,并使用 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 应用程序,上述示例将失败,原因是:
  • 应用程序未将扩展会话标识字节设置为零。
  • 此功能的缓冲区长度为 20,而不是 18。
  • 会话类型指示符不在数据缓冲区中的偏移量 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
   ...