Quiero acceder a funciones dentro de una DLL usando Ruby. Quiero utilizar el acceso de bajo nivel de C sin perder la simplicidad de escribir el código de Ruby. ¿Cómo logro esto?¿Cómo puedo llamar a las funciones DLL de Windows desde Ruby?
Respuesta
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
Creo que también se puede utilizar rubí/dl http://groups.google.com/group/comp.lang.ruby/browse_thread/thread/95a483230caf3d39
o FFI hace que sea más fácil y más cruz VM amigable:
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.
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
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.
Parece que aún no está del todo muerto ... todavía recibe actualizaciones en 2017 – aidan
- 1. Cómo puedo llamar a las funciones de C++ desde ruby
- 2. Cómo llamar a las funciones de Matlab desde C++
- 3. ¿Cómo llamar a Wine dll desde Python en Linux?
- 4. ¿Cómo puedo llamar a las funciones de Delphi en un bpl desde un ejecutable?
- 5. Llamar a las funciones de Powershell desde C#
- 6. Uso de funciones envueltas en SWIG desde Windows .dll
- 7. Llamar a los métodos DLL desde Javascript
- 8. ¿Cómo puedo llamar a las funciones de la API de Windows usando emacs lisp?
- 9. Usando Windows DLL desde Linux
- 10. Llamar a funciones Java desde Clojure
- 11. Llamar a funciones R desde VC++
- 12. Llamar a las funciones de javascript desde el controlador
- 13. Llamar a las funciones de C++ exe desde C#
- 14. Llamar a Python desde Ruby
- 15. Visual Lisp: cómo llamar a funciones en DLL C++ externo
- 16. Llamar a C# dll desde Delphi
- 17. Cómo llamar a la función DLL de C# desde VBScript
- 18. ¿Puedes llamar a una DLL de C desde una DLL de C?
- 19. Llamar a las funciones miembro desde un constructor
- 20. ¿Cómo puedo llamar a Perl desde Java?
- 21. ¿Cómo ver las funciones de DLL?
- 22. Cómo llamar a una DLL .NET desde un proceso Win32?
- 23. ¿Cómo puedo llamar a un archivo DLL desde un lenguaje de scripting?
- 24. ¿Llamar a Lisp desde Ruby/Rails?
- 25. Llamar a C++ DLL de Python
- 26. Cómo llamar a objetos y funciones Java desde CPython?
- 27. ¿Cómo puedo llamar a una DLL .NET desde una secuencia de comandos Inno Setup?
- 28. ¿Cómo puedo llamar a Erlang desde Python?
- 29. ¿Cómo puedo llamar a Enumerable.Join desde F #?
- 30. ¿Cómo llamar funciones desde un parámetro vararg?
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
Win32API y los enlaces de documentación están muertos. – zeboidlund
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) –