2009-06-22 10 views

Respuesta

14

Eche un vistazo a Win32API stdlib. Es una interfaz bastante fácil (pero arcaica) para la API de Windows 32 o DLL.

Documentation is here, algunos examples here. Para darle un sabor:

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

Funciona bastante bien, a menos que su DLL tenga parámetros que Win32API no pueda manejar (como los dobles). A continuación, ingrese el Array.unpack pesadilla – SztupY

+2

Win32API y los enlaces de documentación están muertos. – zeboidlund

+1

Aquí hay algunos enlaces actualizados para la documentación de Win32API: [Ruby 1.8.7] (http://ruby-doc.org/stdlib-1.8.7/libdoc/Win32API/rdoc/) | [Ruby 1.9.2] (http://ruby-doc.org/stdlib-1.9.2/libdoc/dl/rdoc/Win32API.html) | [Ruby 2.0.0] (http://ruby-doc.org/stdlib-2.0.0/libdoc/dl/rdoc/Win32API.html) –

8

Puede use Fiddle: http://ruby-doc.org/stdlib-2.0.0/libdoc/fiddle/rdoc/Fiddle.html

Fiddle es un módulo poco conocido que se ha agregado a la biblioteca estándar de Ruby en 1.9.x. Te permite interactuar directamente con las bibliotecas C de Ruby.

Funciona al envolver libffi, una popular biblioteca C que permite que el código escrito en un idioma llame a métodos escritos en otro. En caso de que no haya oído hablar de él, "ffi" significa "interfaz de función extranjera". Y no solo se limita a C. Una vez que aprende Fiddle, puede usar las bibliotecas escritas en Rust y en otros idiomas que lo admitan.

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 

o

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 
2

Existe la win32-api "drop-in reemplazo para Win32API", de Daniel Berger. Sin embargo, parece que puede no estar actualizado, ya que se lo dejó a la comunidad de código abierto. No se ha actualizado desde el 18 de marzo de 2015. Admite hasta Ruby 2.2 a partir de esta respuesta.

+1

Parece que aún no está del todo muerto ... todavía recibe actualizaciones en 2017 – aidan

Cuestiones relacionadas