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