标准和增强接口注意事项
给定平台上的标准和增强 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
...