第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>