我想使用Ruby访问DLL中的函数.我想使用C的低级访问,同时仍然保留编写Ruby代码的简单性.我该如何做到这一点?
看看Win32API
stdlib.它是Windows 32 API或DLL的一个相当简单(但是很神秘)的接口.
文档在这里,这里有一些例子.给你一个品味:
require "Win32API" def get_computer_name name = " " * 128 size = "128" Win32API.new('kernel32', 'GetComputerName', ['P', 'P'], 'I').call(name, size) name.unpack("A*") end
你可以使用Fiddle:http://ruby-doc.org/stdlib-2.0.0/libdoc/fiddle/rdoc/Fiddle.html
Fiddle是一个鲜为人知的模块,它被添加到1.9.x中的Ruby标准库中.它允许您直接与Ruby的C库交互.
它的工作原理是包装libffi,这是一个流行的C库,允许用一种语言编写的代码调用另一种语言编写的方法.如果您没有听说过,"ffi"代表"外部功能接口".并且您不仅限于C.一旦您学习了Fiddle,您就可以使用Rust编写的库和其他支持它的语言.
http://blog.honeybadger.io/use-any-c-library-from-ruby-via-fiddle-the-ruby-standard-librarys-best-kept-secret/
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
我想你也可以使用ruby/dl http://groups.google.com/group/comp.lang.ruby/browse_thread/thread/95a483230caf3d39
或ffi使它更容易和更多跨VM友好:
https://github.com/ffi/ffi/wiki/Windows-Examples