【问题标题】:How do I call Windows DLL functions from Ruby?如何从 Ruby 调用 Windows DLL 函数?
【发布时间】:2009-06-22 00:04:05
【问题描述】:

我想使用 Ruby 访问 DLL 中的函数。我想使用 C 的低级访问,同时仍然保持编写 Ruby 代码的简单性。我该如何做到这一点?

【问题讨论】:

    标签: c windows ruby dll


    【解决方案1】:

    看看Win32APIstdlib。它是 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 
    

    【讨论】:

    • 它工作得很好,除非你的 DLL 有 Win32API 不能处理的参数(比如双精度)。然后你会进入 Array.unpack 的噩梦
    • Win32API 和文档链接已失效。
    • 以下是 Win32API 文档的一些更新链接:Ruby 1.8.7 | Ruby 1.9.2 | Ruby 2.0.0
    【解决方案2】:

    您可以使用 Fiddle:http://ruby-doc.org/stdlib-2.0.0/libdoc/fiddle/rdoc/Fiddle.html

    Fiddle 是一个鲜为人知的模块,在 1.9.x 中被添加到 Ruby 的标准库中。它允许您直接与来自 Ruby 的 C 库进行交互。

    它通过包装 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】:

        Hiroshi Hatake 和 Daniel Berger 有开源 win32-api“Win32API 的替代品”。它适用于 Ruby 1.8、1.9 和 2.X。

        【讨论】:

        • 看起来它还没有完全消亡……2017 年仍在更新
        • 2020 年还在继续……但当前作者建议转到 FFI。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多