2009-06-22 7 views

Antwort

14

Werfen Sie einen Blick auf Win32API stdlib. Es ist eine ziemlich einfache (aber arkane) Schnittstelle zur Windows 32 API oder DLLs.

Documentation is here, einige examples here. Um Ihnen einen Geschmack:

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

Es funktioniert ziemlich gut, es sei denn, Ihre DLL verfügt über Parameter, die Win32API nicht verarbeiten kann (wie doubles). Dann werden Sie den Array.unpack Alptraum eingeben – SztupY

+2

Win32API und Dokumentation Links sind tot. – zeboidlund

+1

Hier sind einige aktualisierte Links für Win32API-Dokumentation: [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

Sie können benutze Fiddle: http://ruby-doc.org/stdlib-2.0.0/libdoc/fiddle/rdoc/Fiddle.html

Fiddle ist ein wenig bekanntes Modul, das hinzugefügt wurde zu Rubys Standardbibliothek in 1.9.x. Sie können direkt mit C-Bibliotheken von Ruby interagieren.

Es funktioniert durch Wrapping libffi, eine beliebte C-Bibliothek, die Code in einer Sprache geschrieben, um Methoden in einem anderen geschrieben aufrufen können. Falls Sie noch nichts davon gehört haben, steht "ffi" für "Fremdfunktionsschnittstelle". Und Sie sind nicht nur auf C beschränkt. Sobald Sie Fiddle gelernt haben, können Sie Bibliotheken verwenden, die in Rust und anderen Sprachen geschrieben wurden, die es unterstützen.

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 

oder

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

die win32-api "Drop-in-Ersatz für Win32API" Es ist von Daniel Berger. Es scheint jedoch, dass es nicht aktuell bleibt, da er es der Open-Source-Community überlassen hat. Es wurde seit dem 18. März 2015 nicht mehr aktualisiert. Es unterstützt bis zu Ruby 2.2 ab dieser Antwort.

+1

Sieht so aus, als wäre es noch nicht ganz tot ... immer noch Updates in 2017 – aidan

Verwandte Themen