如何从Ruby中调用Windows DLL函数?

问题描述 投票:17回答:4

我想使用Ruby来访问DLL中的函数,我想使用C语言的低级访问,同时保留Ruby代码的简单性。 我想使用C语言的低级访问,同时保留编写Ruby代码的简单性。 我如何实现这个目标?

c windows ruby dll
4个回答
15
投票

请看一下 Win32API stdlib。它是一个相当简单(但很玄乎)的Windows 32 API或DLLs接口。

文档在这里有些 这里的例子. 为了让你尝尝鲜。

require "Win32API"    
def get_computer_name
  name = " " * 128
  size = "128"
  Win32API.new('kernel32', 'GetComputerName', ['P', 'P'], 'I').call(name, size)  
  name.unpack("A*")  
end 

9
投票

你可以使用Fiddle: http:/ruby-doc.orgstdlib-2.0.0libdocfiddlerdocFiddle.html。

Fiddle是一个鲜为人知的模块,在1.9.x中被添加到Ruby的标准库中。它允许你直接与Ruby的C库进行交互。

它的工作原理是包装libffi,一个流行的C库,允许用一种语言编写的代码调用另一种语言编写的方法。如果你没有听说过它,"ffi "代表 "外国函数接口"。而且你不仅仅局限于C语言,一旦你学会了Fiddle,你就可以使用Rust和其他支持它的语言编写的库。

http:/blog.honeybadger.iouse-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

6
投票

3
投票

有开放源码 win32-api "Win32API的drop-in替换",作者Hiroshi Hatake和Daniel Berger。它适用于Ruby 1.8、1.9和2.X。

© www.soinside.com 2019 - 2024. All rights reserved.