问题标签 [ruby-ffi]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
987 浏览

c - 在 Ruby FFI 中声明 char 数组

我有以下 C 代码:

我已经编写了如下等效的 Ruby FFI 声明(遵循FFI wiki上的 structs 建议):

当我运行它时,我收到以下错误:

看来我没有在回调中正确声明 char 数组。从数组在 C 中函数参数中的工作方式来看,我认为我应该使用:pointer而不是[:char, 128]. 但我不确定 FFI 的特性。这里真正正确的语法是什么?

0 投票
1 回答
971 浏览

ruby - 分配给 Ruby FFI 中的嵌套结构成员

考虑以下两个 FFI 结构:

要实例化它们:

现在,当我尝试这样分配ab.nested

我收到以下错误:

如果嵌套结构是“按值嵌套”,那么 FFI 似乎不允许您使用 [] 语法进行分配,也就是说它不是指针。如果是这样,我该如何a分配b.nested

0 投票
1 回答
1171 浏览

ubuntu - Error compiling the tesseract-ocr gem with ruby ffi-inliner

When I try and run the following code,

I get the errors below

The log file mentioned contains the following:

My Gemfile.lock contains the following:

The tesseract version (at least, that provided by Ubuntu) is 3.02.01-2

How do I get this to compile?

0 投票
1 回答
331 浏览

ruby - 如何通过 FFI 更改图标位置?

我正在尝试使用带有 FFI gem 的 Ruby 更改 Windows 7 桌面中图标的位置。

到目前为止,“管理桌面图标”拥有我想要的大部分内容,但它对我不起作用。

这篇文章曾经使用LVA_ALIGNLEFT过,但我知道我需要LVS_ALIGNLEFT根据“ LVM_ARRANGE message ”来使用。

Win32.sendMessage(DesktopHandle, :LVM_ARRANGE, :LVS_ALIGNLEFT, 0)应该左对齐图标但什么都不做。

我曾经Win32.sendMessage(DesktopHandle, :LVM_GETITEMCOUNT, 0, 0)确保我有正确的句柄,这确实输出了我拥有的相同数量的图标。

我从“ LVM_* defs ”中获取了我的大部分值。

我只是不确定为什么这不起作用。

编辑:看起来左对齐实际上正在工作我只是没有意识到它在做什么,我认为使用这个命令应该将我所有的图标移动到我的屏幕左侧,但是这个命令只会改变对齐方式!当您左对齐某些内容或将某些内容居中时,Microsoft word 中的 IE 会改变文本的样式。

现在我需要得到改变图标位置的实际部分来工作:

我仍在寻找的唯一部分是如何MAKELPARAM(10, I)在 ruby​​ 中完成该部分,我想我可能想使用 Ruby 的 array#pack,但我不确定如何去做。

更新:原来我的 LVM 值的来源不是我需要的,而是我使用了“ List-View Messages ”中的值。(我更新了我的数字,所以上面的内容很好)

我还为 MAKELPARAM()找到了“ Ruby Class: Object ”。

这移动了我的一个图标Win32.sendMessage(DesktopHandle, :LVM_SETITEMPOSITION, 0, makeLPARAM(10, 1))

0 投票
1 回答
84 浏览

ruby - FFI - 使用参数类型 FILE 附加函数?

如何在 Ruby 中使用 FFI 包装一个接受 FILE 类型参数的函数?

0 投票
0 回答
505 浏览

ruby - 结构中的指针引用的ruby ffi调用函数?

我正在尝试将 libfluidsynth 与 ruby​​ ffi 一起使用,并且需要遍历 soundfont 以获取所有乐器。具体来说, _fluid_sfont_t 结构有我需要调用的迭代开始和迭代下一个引用:

http://fluidsynth.sourceforge.net/api/struct__fluid__sfont__t.html

我在 ffi/ffi 文档中看到了如何引用结构的成员,其中这些成员是普通类型,并且我看到了如何在 C 中设置回调以指向 ruby​​ Procs。但是我需要调用结构上的函数指针引用的函数。

如何才能做到这一点?

0 投票
1 回答
792 浏览

c++ - 如何使用 C++ 单例返回仅初始化一次的对象

我是一个真正的 C++ 菜鸟,所以请耐心等待。首先让我们设置舞台。

我有一个 C++ 源代码,binary.cpp它编译成一个二进制文件,如下所示:

send_auth方法是从另一个目标代码文件加载的,并传递了一个 foobar 的实例。原因是,Foobar 来自一个我没有来源的 API 对象,并且不能多次实例化。

由于 main 只被调用一次,所以一切都按预期工作:只有一个 Foobar 实例,send_auth可以多次调用。

二进制文件对我没有任何用处,我需要一个共享对象库来做同样的事情。它只创建一个 Foobar 实例并公开一个外部接口方法send_with_auth,在我的共享对象库加载后可以多次调用该方法。

我的库代码library.cpp看起来像这样:

由于我通过 Ruby FFI 加载我的共享对象库,因此我的库需要一些 C 样式的标头library.h

现在有了舞台设置,我必须在我的库中只创建一次 Foobar 的实例,并将其传递给每次调用,send_auth以免 Foobar 出现内存冲突错误。

据我了解,这是我对单例的(过于复杂)尝试。有一个新的library.h像这样:

并且有这个实现library.cpp

这段代码至少可以编译,我可以将所有内容绑定到一个共享对象库。现在,当我在外部进程(在我的情况下使用 Ruby FFI 的 Ruby 模块)中加载该库时,我总是会收到错误消息:

我很确定我从 library.o 到 libfoobar.so 的编译/绑定/剥离过程是可以的,因为它在其他情况下会成功。我很确定我在这里误解了 C++ 的单例概念。我想知道如何实现我的目标:在我的共享对象库中只创建一个 Foobar 实例,并将它传递给我的库向外部公开的唯一方法的每次调用。

有人可以帮忙吗?问候菲利克斯

更新

在库中使用 CommandlineParser 是愚蠢的。事实上,它只是返回了两个 C 字符串。API 库路径和日志目录。有了它,我重新创建了一个命名空间:

这会导致我加载库时出现段错误。与此相反,我可以将这些行直接放入我的函数中:

这里一切正常,除了第二次调用send_with_authlet 让一切崩溃导致 Foobar 再次实例化。

更新 2:

最后我更简单地解决了它,使用全局可用的 bool 开关来初始化我的 Foobar 实例一次:

现在我可以send_with_auth无休止地调用而无需多次实例化 Foobar。完毕!

0 投票
0 回答
102 浏览

ruby-on-rails - 为什么捆绑程序会影响本机 C++ 库的执行

我写了一个Ruby gem使用最新版本的FFI来访问一个(以及自己编写的)共享对象库。我正在ruby 2.0.0p247rvm 1.21.12.

我的 gem 在 /bin 中包含一个“可执行文件”,它按预期工作,读取用户提供的一些数据,并调用我的共享对象库中的一个函数,该函数又调用外部 API 库中的一个函数。一切正常。

RSpec test如果我在 a 或 a内执行与我的“可执行文件”完全相同的代码Rails console,则底层 API 组件将失败。在从容器读取用于对一段 XML 进行数字签名的情况SSL operation下,它似乎失败了。RSA private keyPKCS#12

我能够将所有内容分解为bundler。如果我使用 执行我的(工作)“可执行文件” bundler,它会失败并出现与我在里面看到的相同的错误RSpecRails

我已经交叉检查ENV了变量并在执行时直接设置它们。没变。

所以问题是:bundler对执行环境有什么影响,这会让我的底层 API 组件失败。

我可以从哪里开始查找错误?

欢迎任何提示。问候菲利克斯

0 投票
1 回答
338 浏览

ruby - 为什么 gem 不能自动编译我的 C 扩展

我构建了一个 Ruby gem,它需要一些 C 扩展。这个 - 一旦编译 - 通过 Ruby FFI 绑定到 gem 中。

我的设置:我使用 bundle 作为 gem 脚手架。在我的 gems 文件夹中,我有一个子文件夹ext。这包括一个静态 Makefile、另一个子文件夹source和一个 extconf.rb。

source文件夹包含所有 .c 和 .h 文件。

Makefile 不必动态创建。如果我调用所有编译make clean && makeext并且 gem 按预期工作。

现在我给 extconf.rb 以下内容:

所以我让 mkmf 先创建一个 Makefile,然后用我的静态模板覆盖它。愚蠢的。

当我现在通过构建我的 gemrake build并尝试在另一台机器上安装它时,扩展名没有被编译。

谁能告诉我,为了让扩展在安装时自动编译,我必须做什么?

0 投票
1 回答
136 浏览

ruby - 如何将模块中的方法带入ruby中方法调用者的范围?

代码应如下所示:

我需要功能,因为我想编写一个内联 rust 代码的库,所以应该能够编写:

这在红宝石中可能吗?(如果您需要更多信息,请随时询问!)