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