2009-06-22 13 views

risposta

14

Dai un'occhiata a Win32API stdlib. È un'interfaccia abbastanza facile (ma arcana) per l'API di Windows 32 o DLL.

Documentation is here, alcuni examples here. Per darvi un assaggio:

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

Funziona abbastanza bene, a meno che la DLL non contenga parametri che Win32API non può gestire (come i doppi). Quindi entrerai nell'incubo di Array.unpack – SztupY

+2

Win32API e i collegamenti della documentazione sono morti. – zeboidlund

+1

Ecco alcuni link aggiornati per la documentazione Win32API: [Rubino 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

Puoi utilizzare Fiddle: http://ruby-doc.org/stdlib-2.0.0/libdoc/fiddle/rdoc/Fiddle.html

Fiddle è un poco noto modulo che è stato aggiunto alla libreria standard di Ruby in 1.9.x. Ti consente di interagire direttamente con le librerie C di Ruby.

Funziona avvolgendo libffi, una libreria C popolare che permette di codice scritto in una lingua a chiamare i metodi scritti in un altro. Nel caso in cui non ne abbiate sentito parlare, "ffi" sta per "interfaccia di funzione straniera". E non sei limitato a C. Una volta che hai imparato Fiddle, puoi usare le librerie scritte in Rust e in altre lingue che lo supportano.

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

C'è la win32-api "drop-in sostituzione di Win32API" di Daniel Berger. Tuttavia, sembra che potrebbe non rimanere aggiornato, poiché l'ha lasciato alla comunità open source. Non è stato aggiornato dal 18 marzo 2015. A partire da questa risposta, supporta fino a ruby ​​2.2.

+1

Sembra che non sia ancora completamente morto ... continuando a ricevere aggiornamenti 2017 – aidan

Problemi correlati