加载动态链接库(DLL)并执行库函数。
大纲$ZF(-3,dll_name,func_name,args)
参数
- dll_name 要加载的动态链接库(DLL)的名称,指定为带引号的字符串。当已经加载DLL时,可以将dll_name指定为空字符串(
“”
)。 - func_name 可选-在DLL中执行的函数的名称,指定为带引号的字符串。
- args 可选-以逗号分隔的参数列表,以传递给该函数。
使用$ZF(-3)
加载动态链接库(DLL)并从该DLL执行指定的功能。 $ZF(-3)
返回函数的返回值。
$ZF(-3)
可以通过以下任何一种方式调用:
只需加载一个DLL:
SET x=$ZF(-3,"mydll")
要加载一个DLL并执行位于该DLL中的功能:
SET x=$ZF(-3,"mydll","$$myfunc",1)
使用$ZF(-3)
加载DLL使其成为当前DLL,并自动卸载由先前调用$ZF(-3)
加载的DLL。
要执行位于以前的$ZF(-3)
加载的DLL中的函数,可以通过使用空字符串指定当前DLL来加快执行速度,如下所示:
SET x=$ZF(-3,"","$$myfunc2",1)
要显式卸载当前DLL(由先前$ZF(-3)
调用加载):
SET x=$ZF(-3,"")
$ZF(-3)
只能加载一个DLL。加载DLL会卸载以前的DLL。还可以显式卸载当前加载的DLL,这将导致没有当前加载的DLL。 (但是,请注意,$ZF(-3)
加载和卸载不会影响与$ZF(-5)
或$ZF(-6)
一起使用的加载和卸载,如下所述。)
指定的DLL名称可以是完整路径名,也可以是部分路径名。如果指定部分路径名,则Caché会将其标准化为当前目录。通常,DLL存储在二进制目录(“ bindir”)中。要找到二进制目录,请调用%SYSTEM.Util
类的BinaryDirectory()
方法
动态链接库
动态链接库是一个二进制库,包含可以在运行时加载和调用的例程。当加载一个DLL时,Caché会在其中找到一个名为GetZFTable()
的函数。如果GetZFTable()
存在,它会返回一个指向位于DLL中的函数表的指针。使用这个表,$ZF(-3)
从动态链接库调用指定的函数。
加载多个动态链接库
对$ZF(-3)
的调用一次只能加载一个DLL加载一个动态链接库会卸载之前的动态链接库。要同时加载多个动态链接库,用$ZF(-5)
或$ZF(-6)
执行动态链接库函数。使用$ZF(-3)
加载或卸载动态链接库对使用$ZF(-5)
或$ZF(-6)
加载的动态链接库没有影响。
/// d ##class(PHA.TEST.Function).ZF3()
ClassMethod ZF3()
{
// 定义标注库路径
set libOne = "C:\InterSystems\Cache\bin\MathDll.dll"
set libTwo = "C:\InterSystems\Cache\bin\MathDll.dll"
//加载并调用
s first = $ZF(-3,libOne)
SET result1=$ZF(-3,"C:\InterSystems\Cache\bin\MathDll.dll","Plug_Math_Add",123,1) // 加载libOne并调用FuncA
w "libOne result1 " _ result1,!
SET result2=$ZF(-3,"","Plug_Math_Sub","1") // 从同一个库中调用FuncB
w "libOne result2 " _ result2,!
//加载,然后用空名称调用
SET status=$ZF(-3,libTwo) // 卸载libOne,加载libTwo
w "SET status=$ZF(-3,libTwo) " _ status,!
SET result1=$ZF(-3,"","FunctionOne","arg1")
w "libTwo result1 " _ result1,!
SET result2=$ZF(-3,"","FunctionTwo","argA", "argB")
w "libTwo result2 " _ result2,!
//卸载
SET status=$ZF(-3,"") // 卸载 libTwo
w "status=$ZF(-3,"") " _ status,!
}
<DYNAMIC LIBRARY LOAD>
这个错误一直未解决
DHC-APP>SET result1=$ZF(-3,"C:\InterSystems\Cache\bin\MathDll.dll")
SET result1=$ZF(-3,"C:\InterSystems\Cache\bin\MathDll.dll")
^
<DYNAMIC LIBRARY LOAD>