Как я могу вызвать функции Windows DLL из Ruby? - PullRequest
17 голосов
/ 22 июня 2009

Я хочу получить доступ к функциям внутри DLL, используя Ruby. Я хочу использовать низкоуровневый доступ к C, сохраняя при этом простоту написания кода на Ruby. Как мне это сделать?

Ответы [ 4 ]

15 голосов
/ 22 июня 2009

Посмотрите на Win32API stdlib. Это довольно простой (но загадочный) интерфейс для Windows 32 API или 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 
8 голосов
/ 19 ноября 2015

Вы можете использовать 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
6 голосов
/ 22 июня 2009

Я думаю, вы также можете использовать ruby ​​/ dl http://groups.google.com/group/comp.lang.ruby/browse_thread/thread/95a483230caf3d39

или ffi облегчают работу с VM и делают ее более удобной:

https://github.com/ffi/ffi/wiki/Windows-Examples

3 голосов
/ 24 ноября 2015

Существует win32-api"замена замены для Win32API" Даниэля Бергера. Тем не менее, похоже, что он может не оставаться актуальным, так как он оставил это сообществу открытого исходного кода. Он не обновлялся с 18 марта 2015 года. На данный момент он поддерживает до версии 2.2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...