问题标签 [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.
c - 在 Ruby FFI 中声明 char 数组
我有以下 C 代码:
我已经编写了如下等效的 Ruby FFI 声明(遵循FFI wiki上的 structs 建议):
当我运行它时,我收到以下错误:
看来我没有在回调中正确声明 char 数组。从数组在 C 中函数参数中的工作方式来看,我认为我应该使用:pointer
而不是[:char, 128]
. 但我不确定 FFI 的特性。这里真正正确的语法是什么?
ruby - 分配给 Ruby FFI 中的嵌套结构成员
考虑以下两个 FFI 结构:
要实例化它们:
现在,当我尝试这样分配a
时b.nested
:
我收到以下错误:
如果嵌套结构是“按值嵌套”,那么 FFI 似乎不允许您使用 [] 语法进行分配,也就是说它不是指针。如果是这样,我该如何a
分配b.nested
?
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?
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))
ruby - FFI - 使用参数类型 FILE 附加函数?
如何在 Ruby 中使用 FFI 包装一个接受 FILE 类型参数的函数?
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。但是我需要调用结构上的函数指针引用的函数。
如何才能做到这一点?
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_auth
let 让一切崩溃导致 Foobar 再次实例化。
更新 2:
最后我更简单地解决了它,使用全局可用的 bool 开关来初始化我的 Foobar 实例一次:
现在我可以send_with_auth
无休止地调用而无需多次实例化 Foobar。完毕!
ruby-on-rails - 为什么捆绑程序会影响本机 C++ 库的执行
我写了一个Ruby gem
使用最新版本的FFI
来访问一个(以及自己编写的)共享对象库。我正在ruby 2.0.0p247
与rvm 1.21.12
.
我的 gem 在 /bin 中包含一个“可执行文件”,它按预期工作,读取用户提供的一些数据,并调用我的共享对象库中的一个函数,该函数又调用外部 API 库中的一个函数。一切正常。
RSpec test
如果我在 a 或 a内执行与我的“可执行文件”完全相同的代码Rails console
,则底层 API 组件将失败。在从容器读取用于对一段 XML 进行数字签名的情况SSL operation
下,它似乎失败了。RSA private key
PKCS#12
我能够将所有内容分解为bundle
r。如果我使用 执行我的(工作)“可执行文件” bundler
,它会失败并出现与我在里面看到的相同的错误RSpec
和Rails
。
我已经交叉检查ENV
了变量并在执行时直接设置它们。没变。
所以问题是:bundler
对执行环境有什么影响,这会让我的底层 API 组件失败。
我可以从哪里开始查找错误?
欢迎任何提示。问候菲利克斯
ruby - 为什么 gem 不能自动编译我的 C 扩展
我构建了一个 Ruby gem,它需要一些 C 扩展。这个 - 一旦编译 - 通过 Ruby FFI 绑定到 gem 中。
我的设置:我使用 bundle 作为 gem 脚手架。在我的 gems 文件夹中,我有一个子文件夹ext
。这包括一个静态 Makefile、另一个子文件夹source
和一个 extconf.rb。
该source
文件夹包含所有 .c 和 .h 文件。
Makefile 不必动态创建。如果我调用所有编译make clean && make
,ext
并且 gem 按预期工作。
现在我给 extconf.rb 以下内容:
所以我让 mkmf 先创建一个 Makefile,然后用我的静态模板覆盖它。愚蠢的。
当我现在通过构建我的 gemrake build
并尝试在另一台机器上安装它时,扩展名没有被编译。
谁能告诉我,为了让扩展在安装时自动编译,我必须做什么?
ruby - 如何将模块中的方法带入ruby中方法调用者的范围?
代码应如下所示:
我需要功能,因为我想编写一个内联 rust 代码的库,所以应该能够编写:
这在红宝石中可能吗?(如果您需要更多信息,请随时询问!)