我如何在Ruby中调用Windows DLL函数?(How do I call Windows DL

2019-06-23 19:58发布

我想使用Ruby DLL中使用的功能。 我想用C的低级别的访问,同时仍保留编写Ruby代码的简洁。 如何做到这一点?

Answer 1:

看看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 


Answer 2:

你可以用小提琴: http://ruby-doc.org/stdlib-2.0.0/libdoc/fiddle/rdoc/Fiddle.html

小提琴是被添加到Ruby的标准库在1.9.x中一个鲜为人知的模块 它允许你直接从Ruby的C库交互。

它通过包装libffi,一个流行的C库,允许一种语言编写调用写在另一个方法的代码。 如果你还没有听说过,“FFI”代表“外国功能界面。” 而且你不只是局限于C.一旦你学会了小提琴,可以用书面的抗锈蚀和支持它的其他语言库。

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


Answer 3:

我想你也可以使用Ruby / DL http://groups.google.com/group/comp.lang.ruby/browse_thread/thread/95a483230caf3d39

或FFI使得它更容易和更多的跨VM友好:

https://github.com/ffi/ffi/wiki/Windows-Examples



Answer 4:

还有就是Win32的API “下拉更换为Win32API的”由丹尼尔·伯杰。 但是,看来,它可能无法保持最新​​,因为他如果让开源社区。 它没有被自3月18日更新,2015年它支持高达2.2红宝石作为这个答案的。



文章来源: How do I call Windows DLL functions from Ruby?
标签: c windows ruby dll