Ruby調(diào)用DLL方法簡介
今天,我們要為大家講解有關(guān)Ruby調(diào)用DLL的一些技巧方法,希望初學(xué)Ruby的朋友可以通過本文介紹的內(nèi)容熟練掌握這一技巧應(yīng)用。開源測試工具watir是采用的Ruby語言進(jìn)行開發(fā)的。#t#
在研究watir框架的時候,發(fā)現(xiàn)有一部分函數(shù)watir沒有提供而且暫時沒找到合適的gem包,而很多功能在我們原來的自動化測試框架中都通過c寫的dll進(jìn)行了實現(xiàn),于是我們希望能夠把這部分的dll無縫的移植到watir上,減少我們的工作量,而且可以更高效的實現(xiàn)我們需要的功能。
在Ruby調(diào)用DLL的開源項目中,Win32Api這個gem可以實現(xiàn)我們需要的功能。通過以下方法 ,我們就可以調(diào)用外部dll中的函數(shù)。
Win32Api.new(dllname, proc, import, export)
參數(shù)說明
dllname:dll文件的名字,如果想只寫dll的名字,可以將dll放到system32目錄或者當(dāng)前目錄下,或者寫上dll文件所在的路徑
proc: dll中函數(shù)的名字
import:函數(shù)傳入?yún)?shù)的參數(shù)類型,其中 "p" 對應(yīng)指針,"n","l"對應(yīng)long,"i"對應(yīng)int,"v" 對應(yīng)void,如果有多個參數(shù),可以通過 ["p","n"]數(shù)組的方式來實現(xiàn),其中置為nil可以表示沒有參數(shù)
export:函數(shù)的返回值類型,參數(shù)類型同上
Win32API#call([args ...])
調(diào)用dll中的函數(shù),參數(shù)和返回值應(yīng)該與new申明中的一致,如果返回一個指針,需要事前初始化,否則可能會有內(nèi)存溢出問題。
例子:
有個dll的頭文件的申明為:
extern "C" long PASCAL EXPORT BMPToJPG(char *jpg,char *bmp);
那么在將指定的dll文件放在當(dāng)前目錄,Ruby調(diào)用DLL代碼如下
- require 'rubygems'
- require 'Win32Api'
- JPG=Win32API.new(File.dirname(__FILE__)+"\\JpgDll.dll","BmpToJpg",["p","p"],"l")
- JPG.call("D:\\1.bmp","D:\\1.jpg")
執(zhí)行上述Ruby調(diào)用DLL代碼后,就能把D盤下的1.bmp文件另存為 1.jpg文件。