我想使用Ruby来访问DLL中的函数,我想使用C语言的低级访问,同时保留Ruby代码的简单性。 我想使用C语言的低级访问,同时保留编写Ruby代码的简单性。 我如何实现这个目标?
你可以使用Fiddle: http:/ruby-doc.orgstdlib-2.0.0libdocfiddlerdocFiddle.html。
Fiddle是一个鲜为人知的模块,在1.9.x中被添加到Ruby的标准库中。它允许你直接与Ruby的C库进行交互。
它的工作原理是包装libffi,一个流行的C库,允许用一种语言编写的代码调用另一种语言编写的方法。如果你没有听说过它,"ffi "代表 "外国函数接口"。而且你不仅仅局限于C语言,一旦你学会了Fiddle,你就可以使用Rust和其他支持它的语言编写的库。
require 'fiddle'
libm = Fiddle.dlopen('/lib/libm.so.6')
floor = Fiddle::Function.new(
libm['floor'],
[Fiddle::TYPE_DOUBLE],
Fiddle::TYPE_DOUBLE
)
puts floor.call(3.14159) #=> 3.0
或
require 'fiddle'
require 'fiddle/import'
module Logs
extend Fiddle::Importer
dlload '/usr/lib/libSystem.dylib'
extern 'double log(double)'
extern 'double log10(double)'
extern 'double log2(double)'
end
# We can call the external functions as if they were ruby methods!
puts Logs.log(10) # 2.302585092994046
puts Logs.log10(10) # 1.0
puts Logs.log2(10) # 3.321928094887362
我想你也可以用rubydlhttp:/groups.google.comgroupcomp.lang.rubybrowse_threadthread95a483230caf3d39。
或 ffi 使得它更容易和更跨虚拟机友好。
有开放源码 win32-api "Win32API的drop-in替换",作者Hiroshi Hatake和Daniel Berger。它适用于Ruby 1.8、1.9和2.X。