我想使用Ruby訪問DLL中的函數。我想使用C的低級訪問,同時仍然保持編寫Ruby代碼的簡單性。我該如何做到這一點?如何從Ruby調用Windows DLL函數?
16
A
回答
14
看看Win32API
stdlib。這是一個相當簡單(但神祕)的Windows 32 API或DLL接口。
Documentation is here,一些examples here。爲了給你一個味道:
require "Win32API"
def get_computer_name
name = " " * 128
size = "128"
Win32API.new('kernel32', 'GetComputerName', ['P', 'P'], 'I').call(name, size)
name.unpack("A*")
end
5
我想你也可以使用Ruby/DL http://groups.google.com/group/comp.lang.ruby/browse_thread/thread/95a483230caf3d39
或FFI使得它更容易和更多的跨VM友好:
8
你可以使用小提琴:http://ruby-doc.org/stdlib-2.0.0/libdoc/fiddle/rdoc/Fiddle.html
小提琴是一個鮮爲人知的模塊,被添加到1.9.x中的Ruby標準庫。它允許您直接與來自Ruby的C庫進行交互。
它通過包裝libffi工作,這是一種流行的C庫,允許用一種語言編寫的代碼調用另一種語言編寫的方法。如果您還沒有聽說過,「ffi」代表「外部功能接口」。而且你不僅限於C.一旦你學習了Fiddle,你可以使用用Rust和其他支持它的語言編寫的庫。
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
或
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
還有就是win32-api 「落更換爲Win32API的」 由丹尼爾·伯傑。但是,它似乎並未保持最新狀態,因爲他已將它留給了開源社區。它從2015年3月18日起一直沒有更新過。它支持Ruby 2.2以上的答案。
相關問題
- 1. 如何從VB調用C++ DLL函數?
- 2. 如何從VBScript調用C#DLL函數
- 3. 如何從Windows中的一個DLL調用一個函數?
- 4. 從DLL調用函數?
- 5. 從VB6調用DLL函數
- 6. 從matlab調用dll函數
- 7. 從PHP調用Windows DLL
- 8. 調用DLL函數
- 9. 從dll函數調用中正確獲取Windows版本?
- 10. 如何在vbscript中調用DLL函數
- 11. 如何聆聽dll函數調用
- 12. 如何從我的dll調用函數從jquery
- 13. 從actionscript調用.net dll函數
- 14. 從goroutine調用阻塞DLL函數?
- 15. 從python中調用dll函數
- 16. C# - 從動態庫DLL調用函數
- 17. 從tcl通過twapi調用DLL函數
- 18. 從C#調用delphi DLL函數代碼
- 19. 從dll調用函數到exe C++
- 20. 從注入的DLL中調用函數
- 21. 從InstallAware或InstallShield調用dll函數
- 22. 從Python中調用DLL函數
- 23. 從C++/CLI調用C#dll函數
- 24. 如何在ruby中調用C#dll?
- 25. 如何從特定引用的DLL調用函數
- 26. 如何在Ruby中調用函數?
- 27. 如何從UWP中的DLL調用函數?
- 28. 如何從C#代碼調用非託管dll中的函數?
- 29. 如何從C++/C調用這個DLL函數#
- 30. 如何在mono/linux上從Java調用.Net dll(函數)
它工作得很好,除非你的DLL有Win32API無法處理的參數(比如雙打)。然後你會進入Array.unpack噩夢 – SztupY 2009-06-22 00:41:05
Win32API和文檔鏈接已經死了。 – zeboidlund 2014-09-05 09:39:48