我想使用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