第105章 Caché 函数大全 $ZF(-3) 函数 第105章 Caché 函数大全 $ZF(-3) 函数 大纲 描述 注意

第105章 Caché 函数大全 $ZF(-3) 函数

加载动态链接库(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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章