Ich möchte auf Funktionen innerhalb einer DLL mit Ruby zugreifen. Ich möchte den Low-Level-Zugriff von C verwenden, während ich gleichzeitig die Einfachheit des Schreibens von Ruby-Code beibehalte. Wie erreiche ich das?Wie rufe ich Windows DLL-Funktionen von Ruby?
Antwort
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
Ich glaube, Sie auch Rubin/dl http://groups.google.com/group/comp.lang.ruby/browse_thread/thread/95a483230caf3d39
verwenden oder ffi macht es einfacher und Quer VM Freundlich:
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.
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
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.
Sieht so aus, als wäre es noch nicht ganz tot ... immer noch Updates in 2017 – aidan
- 1. Wie rufe ich Python-Code von Ruby?
- 2. Wie rufe ich einen Windows-Shell-Befehl mit VB6?
- 3. Wie rufe ich ein Perl-Skript unter Windows auf?
- 4. Wie rufe ich Werte von dojo.data.ItemFileReadStore
- 5. Wie rufe ich Enumerable.Join von F #?
- 6. Wie rufe ich eine Ruby-Methode auf, wenn: onchange-Event ausgelöst wird (Ruby auf Rails 4)?
- 7. Wie rufe ich einen Java-Prozess von Windows PowerShell aus auf?
- 8. Wie rufe ich SetWindowLong() in den 64-Bit-Versionen von Windows auf?
- 9. Wie rufe ich animateAlongsideTransition in Swift?
- 10. Wie update Ruby in Windows
- 11. Wie rufe ich HTML über AJAX - Elgg?
- 12. Wie rufe ich Redis StringSet() aus F #
- 13. Wie rufe ich IL2JS richtig auf?
- 14. Wie rufe ich C++ - Compiler programmgesteuert auf?
- 15. Wie rufe ich ein bestimmtes PreferenceFragment von einer PreferenceActivity auf?
- 16. wie rufe ich asp.net regExp validator von Javascript auf?
- 17. Wie rufe ich eine TSQL-Funktion von ado.net
- 18. Wie rufe ich Dajax/Dajaxice Funktionen von meiner Django Vorlage
- 19. Wie rufe ich die ReplaceFile-Funktion von C# auf?
- 20. Wie rufe ich meine Methode von meinem Dienst an?
- 21. Wie rufe ich von v-imode in das Systemregister?
- 22. Wie rufe ich C von Go über die "Fremdfunktionsschnittstelle" an?
- 23. Wie rufe ich MVC Controller von mit Javascript-Funktion
- 24. Wie rufe ich sc create von einem Powershell-Skript auf
- 25. Wie rufe ich Stargazer auf einer Liste von Modellen auf?
- 26. Wie rufe ich eine Capistrano-Aufgabe von einer anderen auf?
- 27. Wie rufe ich eine Member-Funktion von ComponentDidMount
- 28. Wie rufe ich die Win32-API von einem Cygwin-Programm
- 29. Wie rufe ich eine Controller-Methode von JQuery?
- 30. Wie rufe ich eine Flask-Ansicht von einem anderen an?
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
Win32API und Dokumentation Links sind tot. – zeboidlund
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) –