使用 $ZF Callout Interface
,可以用外部语言编写函数并从 ObjectScript
调用它们。标注库通常用 C
编写,但也可能用使用 C
编译器理解的调用约定的任何其他编译语言编写。出现两个兼容性问题。首先,编译器必须使用与 C
兼容的应用程序二进制接口 (ABI
)。其次,编译器生成的代码必须不依赖于与 IRIS
不兼容的任何运行时库功能。
InterSystems
支持使用与我们在所有平台上生成 IRIS
相同的 C
编译器:
Platform | Compiler |
---|---|
IBM AIX | IBM XL C for AIX |
Mac OS X (Darwin) | Xcode |
Microsoft Windows | Microsoft Visual Studio |
Linux (all variants) | GNU Project GCC C |
大多数平台都有标准化的应用程序二进制接口 (ABI),使大多数编译器兼容。 Intel x86-32
和 x86-64
平台是主要例外,这些平台存在多种调用约定。有关这些平台上的调用约定的讨论,请参阅 (https://en.wikipedia.org/wiki/X86_calling_conventions在。
许多 C
编译器允许为外部例程声明不同的调用约定。通过编写声明适当调用约定的 C
包装例程,可以调用用另一种语言编写的例程。
Callout
库可以包含自定义内部函数,这些函数将在加载(runup
)或卸载(rundown
)共享对象时调用。在这两种情况下都不会传递任何参数。函数使用如下:
ZFInit
— 当 $ZF(-3)
、$ZF(-4,1)
或 $ZF(-6)
首次加载标注库时调用。该函数的返回码应为零以指示不存在错误,或非零以指示存在问题。如果调用成功,则会保存 ZFUnload rundown
函数的地址。ZFUnload
— 当调用 $ZF(-3)
卸载或替换 Callout
库时,或者通过 $ZF(-4,2)
或 $ZF(-4,4)
卸载时调用。进程停止时不会调用它。如果在 rundown
函数期间发生某些错误,将禁用对其的进一步调用,以允许卸载 Callout
库。 ZFUnload
的返回值当前被忽略。构建 Callout
库时,可能需要在链接过程中显式导出符号 ZFInit
和 ZFUnload
。