一個DLL文件(有.dll擴展名)和DLL代表動態鏈接庫。一個DLL文件是一個編譯過的函數,對象,和類的集合。DLL可以被用來節約內存的使用,你可以在你的程序中裝載需要的DLL然后按照期望的那樣使用它們,而不是在每個程序中都定義所有的代碼,這意味著同一個DLL可以被多個不同的程序所使用。
那么為什么在silktest中需要調用一個DLL呢?這是因為Silktest所使用的腳本語言4Test可能沒有你對特定對象操作時需要用到的所有的函數,因此,你可能需要使用外部的函數來使用這種對象。通過DLL文件調用這些函數可以做到這一點。
在4Test中使用dll有很多好處,其一就是你能使你的代碼更加強大。只要你可以導入能夠處理那些對象的dll,你就可以訪問外部的功能。另一個是可移植性,你可以建立在多個不同腳本和環境中使用的dll。一個dll可以被不同的人在許多不同的腳本中使用。
Dll主要被用來添加那些silktest不支持的函數功能。例如,在PageList類中,silktest無法得到pageList對象或者特定標簽的RECT里面有多少行,不過,在windows API中有函數可以得到這些信息。但是API中的函數使用的數據類型4Test不支持,所以你需要建立一個dll調用他們并且使用silktest支持的數據類型將需要的信息返回給4Test。
那么具體如何在silktest中調用DLL呢?大家可以參照下面的這個4Test語言調用dll的模板。
dll dllname.dll
prototype
[prototype]...
而下面是一個用4Test調用dll鎖住工作站的簡單例子。
[-] dll "user32.dll"
[ ] int LockWorkStation ()
[ ]
[-] testcase WorkStationLock () appstate none
[ ]
[ ] LockWorkStation()
[ ]
[ ]
注意:你可以從4Test腳本調用DLL函數,但是不能調用dll中的成員函數,這是因為silktest只能認出dll通過Export表暴露出來的函數。你無法調用成員函數,因為可能它僅僅是被用來為其他dll函數服務并且是獨立運行的。
silktest只能處理標準的windows dll,對于非標準的windows 程序映像,silktest將返回一個出錯消息。Silktest只能使用c/c++編寫的標準windows dll。Silktest無法使用visual basic編寫的dll,這是因為,雖然wisual basic 雖然可以用來建立ActiveX dll,但是它無法像visual c++一樣建立標準windows dll 。
但是dll并非一定要用c或者c++編寫。dll中所有可調用的函數必須和一個接口保持一致。如果它是一個可以被任何程序調用的外部函數或者事件,你需要找出外部符號名稱,然后可以像dll調用那樣調用它。所以,一個技巧就是,找出事件或者函數的外部名稱。這樣你就可以在4Test中聲明和調用它。而4Test擁有的唯一直接訪問VB對象的機制是通過GUI外部的屬性和方法。所以,通過上面簡單的討論,在VB程序中沒有辦法調用一個事件。
下面的文件是一些在4Test中調用dll的例子。
WorkLock.t文件是一個鎖定工作機的例子。
WorkLock.t文件是一個鎖定工作機的例子。
[-] dll "user32.dll"
[ ] int LockWorkStation ()
[-] testcase WorkStationLock () appstate none
[ ] LockWorkStation()
winClose.t文件是一個關閉窗口的例子。
[-] dll "user32.dll"
[-] dll "user32.dll"
[ ] int CloseWindowStation(Long hWinSta)
[ ]
[-] testcase WinClose() appstate none
[ ] int hWinSta= 1
[ ] CloseWindowStation(hWinSta)
SysExecuteAlternative.t文件是一個SysExecute的例子。
[ ] // An alternative to SYS_Execute which uses ShellExecuteA called from the DLL "shell32".
[ ] // This code returns control back to SilkTest unlike SYS_Execute.
[ ] // Call the function from the windows API and set the prototype
[-] dll "shell32"
[] int ShellExecuteA (int hwnd, String lpOperation, String lpFile, string lpParameters,String lpDirectory, int nShowCmd)
[ ]
[ ]
[-] testcase ShellExe() appstate none
[ ] // Sets iHandle = to the window handle for the desktop
[ ] int iHandle = Desktop.GetHandle()
[ ] // The operation that is to be carried out
[ ] string lpOperation = "open"
[ ] // The file on which this operation will be carried out
[ ] string lpFile = "iexplore"
[ ] // Any additional parameters to the commandline
[ ] string lpParameters = " "
[ ] // The working directory in which this will be run
[ ] string lpDirectory = "C:\Program Files\Internet Explorer"
[ ] // a flag that determines how the command will be shown
[ ] int iShowCmd = 5
[ ] ShellExecuteA (iHandle,lpOperation,lpFile,lpParameters,lpDirectory,iShowCmd)
關于別名:
如果一個函數和4Test保留字同名,或者函數只有序數名,你需要在4Test的聲明里面使用別名語句重新命名它。例如,exit已經被4Test編譯器保留了,而你又需要調用一個名為exit的函數。你需要用另外的名字聲明它,添加一個alias聲明,就象下面的樣子。
dll "mydll.dll"
my_exit ()
alias exit
Dll和用戶對象:
dll提供了另一種途徑訪問用戶對象的方法和屬性。使用dll語句在4Test中聲明一個動態鏈接庫并且定義它的函數原型,一個函數可以像4Test內置函數那樣被調用。例如,user32.dll中的SendMessage函數在SetText和TypeKeys拒絕工作的時候用來在Text Field中輸入一個字符串。僅僅需要使用ClipBoard.SetText("some string")把該字符串拷貝到粘貼板,然后像下面這樣使用API消息WM_Paste調用SendMessage:
dll提供了另一種途徑訪問用戶對象的方法和屬性。使用dll語句在4Test中聲明一個動態鏈接庫并且定義它的函數原型,一個函數可以像4Test內置函數那樣被調用。例如,user32.dll中的SendMessage函數在SetText和TypeKeys拒絕工作的時候用來在Text Field中輸入一個字符串。僅僅需要使用ClipBoard.SetText("some string")把該字符串拷貝到粘貼板,然后像下面這樣使用API消息WM_Paste調用SendMessage:
SendMessage(MyWindow.hWnd, WM_PASTE, 0,0).
這樣的組合語句將得到粘貼板上的內容把它們貼到頑固的TextField上。用戶空間經常需要對SendMessage做出響應,但是這要求消息被發送。你可能需要咨詢用戶對象的開發者從而得到消息的名字和需要的參數。
那么哪些數據類型可以傳給DLL中的函數呢?
調用C/C++編寫的DLL函數,需要使用合適的C數據類型。4Test支持下面的數據類型。
C Data Type |
Size (byte) |
4Test Equivalent |
Char |
1 |
String |
Int |
4 |
Integer |
Short |
2 |
Integer |
Long |
4 |
Long |
Unsigned Char |
1 |
String |
Unsigned int |
4 |
UINT |
Unsigned Short |
2 |
UINT |
Unsigned long |
4 |
Long |
Float |
4 |
Number |
Double |
8 |
Number |
除此以外,你還可以傳入由上面的數據類型組成的數組或者記錄(但是不能是記錄的數組)。如果其他任何數據類型被傳入DLL中的函數,將會產生一個錯誤。
不過你也不可以傳遞一個指針和對象給DLL中的函數。Silktest不能處理COM DLL,因為如果一個COM DLL中的函數沒有被導出,silktest就無法訪問他們。COM可能不導出函數,因為對COM任何處理都是通過接口進行,這就意味著不可以進行DLL調用。
最后列出一些在silktest中調用DLL函數的過程中常見錯誤信息,讓我們對它們進行簡單的分析。
下面是一個最常見的錯誤消息:
1.Error Message: *** Error: DLL cannot be loaded Error 126
該錯誤可能的原因是silktest無法找到DLL。請確保你的DLL被指定了完整的路徑名,不要使用相對路徑,例如:不要用“.”來表示當前目錄。
2.Error Message: *** Error: Function SftTree_GetHeader_Col not found in <DLL path and name>
該可能的原因是silktest無法找到函數。請確保你的函數名稱拼寫正確,確保你的函數被DLL導出了。你可以使用Quick View打開DLL,然后查看導出表,確保該函數在導出表中,因為silktest只能看到那些在DLL導出表中的函數。
3.Error Message: *** Error: Exception in DLL call -- Function <function name>: code <hex #>, flags <hex #>, address <hex #>
該可能的原因是4Test對于函數的聲明不正確。請按照你的DLL函數原型在4Test中聲明該函數,確保函數的參數個數和參數類型都正確。
如果函數被加載進入應用程序的進程空間而不是silktest的進程空間,你必須在聲明DLL的時候使用inprocess關鍵字。
延伸閱讀
文章來源于領測軟件測試網 http://www.kjueaiud.com/