Je souhaite accéder aux fonctions d'une DLL à l'aide de Ruby. Je veux utiliser l'accès de bas niveau de C tout en conservant la simplicité d'écriture du code Ruby. Comment puis-je accomplir cela?Comment appeler les fonctions DLL de Windows à partir de Ruby?
Répondre
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
Je pense que vous pouvez également utiliser Ruby/dl http://groups.google.com/group/comp.lang.ruby/browse_thread/thread/95a483230caf3d39
ou ffi rend plus facile et plus croix VM convivial:
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.
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
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.
On dirait que ce n'est pas tout à fait mort ... encore des mises à jour 2017 – aidan
- 1. Appel des fonctions DLL à partir de VB6
- 2. Comment appeler DLL à l'intérieur de Java?
- 3. Comment appeler C# .dll à partir d'une application C++/CLI?
- 4. Comment appeler un processus Java à partir de Windows Powershell?
- 5. Qt4: Comment appeler les fonctions JavaScript dans une page à partir de C++ via QtWebkit?
- 6. Énumérer les fonctions DLL?
- 7. Comment puis-je appeler une DLL à partir d'un langage de script?
- 8. Comment appeler une application C# windows à partir d'un contrôle?
- 9. Pouvez-vous appeler des fonctions C++ à partir d'Ada?
- 10. Comment appeler une DLL Delphi de VB6
- 11. Puis-je appeler les services Web REST à partir de l'application Windows Mobile
- 12. Comment déclencher les fonctions javascript à partir de flash?
- 13. Comment puis-je appeler des fonctions javascript et passer des valeurs à partir de XAML/Silverlight?
- 14. Comment appeler une fonction à partir de données binaires
- 15. Comment contrôler les symboles qu'une DLL Windows importe à partir de l'application?
- 16. Comment appeler des objets et des fonctions java à partir de CPython?
- 17. Comment faire pour appeler la fonction DLL C# à partir de VBScript
- 18. Comment appeler le code Java à partir de C#?
- 19. Appels Windows Mobile API à partir de .NET - quelle DLL et quelles sont les valeurs enum
- 20. Problème avec jQuery appeler dynamiquement les fonctions
- 21. Shell exécuter à partir de Ruby
- 22. À partir .exe à partir de Visual C++ 2005 dll
- 23. Est-il prudent de passer des pointeurs de fonction en tant qu'arguments aux fonctions dll et de les appeler de l'intérieur de la DLL?
- 24. Débogage de ma DLL Windows pouvant être appelée à partir d'un service Windows
- 25. Comment appeler les fonctions imbriquées dans un plugin JQuery?
- 26. Je veux savoir quelles fonctions sont disponibles à partir d'un Win32.DLL
- 27. Obtenir le nom d'une DLL à partir de la DLL
- 28. Appel de la DLL à partir du mode noyau C++ windows
- 29. Utilisation de DLL mixtes à partir de/clr: projets purs
- 30. Comment utiliser nokogiri à partir de Jruby sur Windows?
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
Les liens Win32API et Documentation sont morts. – zeboidlund
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) –