2009-06-22 7 views

Répondre

14

Jetez un oeil à Win32API stdlib. C'est une interface assez facile (mais mystérieuse) à l'API Windows 32, ou aux DLL.

Documentation is here, certains examples here. Pour vous donner un avant-goût:

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

Il fonctionne très bien, à moins que votre DLL a des paramètres que Win32API ne peut pas gérer (comme doubles). Ensuite, vous entrez dans le cauchemar Array.unpack – SztupY

+2

Les liens Win32API et Documentation sont morts. – zeboidlund

+1

Voici quelques liens mis à jour pour la documentation 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

Vous pouvez utiliser Fiddle: http://ruby-doc.org/stdlib-2.0.0/libdoc/fiddle/rdoc/Fiddle.html

Fiddle est un module peu connu qui a été ajouté à la bibliothèque standard de Ruby en 1.9.x. Il vous permet d'interagir directement avec les bibliothèques C de Ruby.

Il fonctionne en enroulant libffi, une bibliothèque populaire C qui permet le code écrit dans une langue d'appeler des méthodes écrites dans une autre. Au cas où vous n'en auriez pas entendu parler, "ffi" signifie "interface de fonction étrangère". Et vous n'êtes pas limité à C. Une fois que vous avez appris le violon, vous pouvez utiliser des bibliothèques écrites en rouille et dans d'autres langues qui le supportent.

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 

ou

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

Il est le win32-api "drop-in de remplacement pour Win32API" par Daniel Berger. Cependant, il semble qu'il ne reste pas à jour, puisqu'il l'a laissé à la communauté open source. Il n'a pas été mis à jour depuis le 18 mars 2015. Il supporte jusqu'à ruby ​​2.2 à partir de cette réponse.

+1

On dirait que ce n'est pas tout à fait mort ... encore des mises à jour 2017 – aidan

Questions connexes