Как я могу назвать функции DLL Windows из Ruby?
Я хочу получить доступ к функциям в DLL, используя Ruby. Я хочу использовать низкоуровневый доступ к C, сохраняя при этом простоту написания кода Ruby. Как это сделать?
Ответы
Ответ 1
Посмотрите Win32API
stdlib. Это довольно простой (но тайный) интерфейс для API Windows 32 или DLL.
Документация здесь, некоторые примеры здесь. Чтобы дать вам вкус:
require "Win32API"
def get_computer_name
name = " " * 128
size = "128"
Win32API.new('kernel32', 'GetComputerName', ['P', 'P'], 'I').call(name, size)
name.unpack("A*")
end
Ответ 2
Вы можете использовать Fiddle: http://ruby-doc.org/stdlib-2.0.0/libdoc/fiddle/rdoc/Fiddle.html
Fiddle - малоизвестный модуль, который был добавлен в стандартную библиотеку Ruby в 1.9.x. Это позволяет вам напрямую взаимодействовать с библиотеками C из Ruby.
Он работает, обертывая библиотеку libffi, популярную библиотеку C, которая позволяет коду, написанному на одном языке, вызывать методы, написанные в другом. Если вы не слышали об этом, "ffi" означает "интерфейс внешней функции". И вы не ограничиваетесь только C. Когда вы изучаете Fiddle, вы можете использовать библиотеки, написанные на Rust и других языках, которые его поддерживают.
http://blog.honeybadger.io/use-any-c-library-from-ruby-via-fiddle-the-ruby-standard-librarys-best-kept-secret/
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
Ответ 3
Я думаю, вы также можете использовать ruby /dl
http://groups.google.com/group/comp.lang.ruby/browse_thread/thread/95a483230caf3d39
или ffi упрощает и упрощает взаимодействие с VM:
https://github.com/ffi/ffi/wiki/Windows-Examples
Ответ 4
Существует ссылка win32-api "замена замены для Win32API" Даниэля Бергера. Однако, похоже, что он не может оставаться актуальным, поскольку он оставил его сообществу с открытым исходным кодом. Он не обновлялся с 18 марта 2015 года. Он поддерживает до рубина 2.2 от этого ответа.