类型为 nativeLibrary 的库允许 EGL 生成的 Java™ 代码调用单个在本地运行的 DLL。该 DLL 的代码不是用 EGL 语言编写的。有关开发基本库(包含用 EGL 语言编写的共享函数和值)的信息,请参阅类型为 basicLibrary 的库部件。
在类型为 nativeLibrary 的库中,每个函数的用途在于为 DLL 函数提供接口。不能在 EGL 函数中定义语句,也不能在库中的任何位置声明变量或常量。
EGL 运行时通过使用 EGL 函数属性 alias 的设置(缺省为 EGL 函数名)来访问基于 DLL 的函数。如果基于 DLL 的函数的名称不符合命名约定中描述的约定,则明确设置该属性。
库函数中的参数必须是基本变量,并且可以是 ANY 类型,但不能是松散类型,也不能包括 field 修饰符。
库属性 dllName 指定 DLL 名称,这是最终名称;在部署时不能覆盖它。如果未对库属性 dllName 指定值,则必须在 Java 运行时属性 vgj.defaultI4GLNativeLibrary 中指定 DLL 名称。因为只有一个这样的 Java 运行时属性对运行单元可用,所以除了在 EGL 库中标识的 DLL 之外,只能指定一个 DLL。
不管您是在开发时(在 dllName 中)还是在部署时(在 vgj.defaultI4GLNativeLibrary)指定 DLL 名称,该 DLL 必须驻留在运行时变量中标识的目录路径中;该变量为 PATH(在 Windows® 2000/NT/XP 上)或 LIBPATH(在 UNIX® 平台上)。
库函数将自动声明为公用函数以确保它们在库外部可用。在其它 EGL 代码中,可以在不指定库名的情况下引用函数(仅使用其函数别名),但仅当将该库包括在特定于程序的使用声明中时才能这样做。
EGL 库被生成为 Java 类,该类与访问该库的代码和 DLL 是分开的。EGL 运行时通过使用库属性 alias 的设置(缺省为 EGL 库名)来访问该类。如果库部件的名称不符合 Java 约定,则明确设置该属性。
在运行时,当第一次使用 DLL 时会将其装入,并在访问该程序或 PageHandler 离开内存(在运行单元结束时)时卸装该库。
每当装入 PageHandler 时,该 PageHandler 都将获得 DLL 的新副本。并且,对于被类型为 basicLibrary 的 EGL 库调用的 DLL,只要调用库在内存中,被调用的 DLL 也会在内存中。
Library myLibrary type nativeLibrary {callingConvention=”I4GL”, dllname=”mydll”} Function entryPoint1( p1 int nullable in, p2 date in, p3 time in, p4 interval in, p5 any out) end Function entryPoint2( p1 float in, p2 String in, p3 smallint out) end Function entryPoint3( p1 any in, p2 any in, p3 any out, p4 CLOB inout) end end