如何从Ruby调用Windows DLL函数?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (18)

我想使用Ruby访问DLL中的函数。我想使用C的低级访问,同时仍然保留编写Ruby代码的简单性。我该怎么做?

提问于
用户回答回答于

看看Win32APIstdlib。这是一个相当简单的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

扫码关注云+社区