Desidero accedere alle funzioni all'interno di una DLL utilizzando Ruby. Voglio usare l'accesso a basso livello di C pur mantenendo la semplicità di scrivere il codice Ruby. Come posso realizzare questo?Come si chiamano le funzioni DLL di Windows da Ruby?
risposta
Dai un'occhiata a Win32API
stdlib. È un'interfaccia abbastanza facile (ma arcana) per l'API di Windows 32 o DLL.
Documentation is here, alcuni examples here. Per darvi un assaggio:
require "Win32API"
def get_computer_name
name = " " * 128
size = "128"
Win32API.new('kernel32', 'GetComputerName', ['P', 'P'], 'I').call(name, size)
name.unpack("A*")
end
Penso che si può anche utilizzare rubino/dl http://groups.google.com/group/comp.lang.ruby/browse_thread/thread/95a483230caf3d39
o ffi rende più facile e più croce VM amichevole:
Puoi utilizzare Fiddle: http://ruby-doc.org/stdlib-2.0.0/libdoc/fiddle/rdoc/Fiddle.html
Fiddle è un poco noto modulo che è stato aggiunto alla libreria standard di Ruby in 1.9.x. Ti consente di interagire direttamente con le librerie C di Ruby.
Funziona avvolgendo libffi, una libreria C popolare che permette di codice scritto in una lingua a chiamare i metodi scritti in un altro. Nel caso in cui non ne abbiate sentito parlare, "ffi" sta per "interfaccia di funzione straniera". E non sei limitato a C. Una volta che hai imparato Fiddle, puoi usare le librerie scritte in Rust e in altre lingue che lo supportano.
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
C'è la win32-api "drop-in sostituzione di Win32API" di Daniel Berger. Tuttavia, sembra che potrebbe non rimanere aggiornato, poiché l'ha lasciato alla comunità open source. Non è stato aggiornato dal 18 marzo 2015. A partire da questa risposta, supporta fino a ruby 2.2.
Sembra che non sia ancora completamente morto ... continuando a ricevere aggiornamenti 2017 – aidan
- 1. Come si chiamano le funzioni Delphi in un bpl da un file eseguibile?
- 2. Come si chiamano le DLL C++/CLI (.NET) da applicazioni non-.NET standard non gestite?
- 3. Come si chiamano le funzioni in modo dinamico con Haskell
- 4. funzioni anonime si chiamano in MATLAB
- 5. Strano comportamento quando si chiamano le funzioni virtuali
- 6. Esportare le funzioni da dll solo ordinale
- 7. Utilizzo di funzioni SWIG con wrapping da Windows .dll
- 8. Come visualizzare le funzioni DLL?
- 9. Come creare una DLL NIM e lo chiamano da C#
- 10. Perché javascript promette asincrono quando si chiamano solo funzioni sincrone?
- 11. Forza le parentesi anche quando si chiamano le funzioni senza parametri in VB.NET?
- 12. Come si concatenano le funzioni usando lodash?
- 13. Come riutilizzare il codice tra le funzioni const e non-const che chiamano altre funzioni
- 14. Impostazione forma Django Le opzioni ChoiceField come Form si chiamano
- 15. DisconnectedContext MDA quando si chiamano le funzioni WMI nell'applicazione a thread singolo
- 16. Come si chiamano più script MSBuild da uno script MSBuild
- 17. Chiamare le funzioni DLL C/C++ non gestite da SQL Server 2008
- 18. Visual Lisp: come chiamare le funzioni in DLL C++ esterna
- 19. Leggere le risorse da un file DLL
- 20. Perché ci sono overhead che chiamano le funzioni Haskell da C?
- 21. C'è qualche colpo di grazia usando le funzioni della DLL?
- 22. Chiamata di funzioni da un C++ DLL in Delphi
- 23. Come chiamare le funzioni di una DLL COM (in VC++) da un'applicazione VC++ .EXE?
- 24. Esportazione di funzioni da C++ dll a C# P/Invoke
- 25. Guarda le risorse utilizzate da exe \ dll
- 26. API Win32 per enumerare le funzioni di esportazione dll?
- 27. Perché si chiamano "banda di quattro"?
- 28. Ricerca DLL su Windows
- 29. Come proteggere le DLL .NET
- 30. Come proteggere le DLL?
Funziona abbastanza bene, a meno che la DLL non contenga parametri che Win32API non può gestire (come i doppi). Quindi entrerai nell'incubo di Array.unpack – SztupY
Win32API e i collegamenti della documentazione sono morti. – zeboidlund
Ecco alcuni link aggiornati per la documentazione Win32API: [Rubino 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) –