问题标签 [rubydl]

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 投票
3 回答
3719 浏览

c - 你如何使用 Ruby/DL?这是正确的吗?

我正在尝试编写 RSPEC(ruby 风格的 BDD)和 Windows 应用程序之间的接口。应用程序本身是用一种晦涩难懂的语言编写的,但它有一个 C API 来提供访问权限。我已经使用 Ruby/DL,但即使是最基本的 DLL 方法调用也很难工作。这是我目前在一个名为 gt4r.rb 的文件中所拥有的:

到目前为止,我的阅读表明这就是我所需要的,所以我写了一个 RSPEC 示例:

而运行时...

返回值 (13) 是一个实际的返回代码,表示错误,但是当我尝试将 gTD_get_error_message 调用添加到我的 RSPEC 时,我无法让参数正常工作。

我是否朝着正确的方向前进,任何人都可以指出我可以尝试的下一件事吗?

谢谢,布雷特


对此问题的跟进,显示了当我尝试从目标库中获取错误消息时失败的部分:

我希望在@msg 中返回错误消息,但是运行时我得到以下信息:

如果我使用符号 (:msg) 来代替:

显然我错过了一些关于在 ruby​​ 和 C 之间传递参数的东西,但是什么?

0 投票
3 回答
554 浏览

c - 如何在 C -> ruby​​ 接口中返回变量?

对先前问题的跟进,显示了当我尝试从目标库获取错误消息时失败的部分:

我希望在@msg 中返回错误消息,但是运行时我得到以下信息:

如果我使用符号 (:msg) 来代替:

显然,我遗漏了一些关于在 ruby​​ 和 C 之间传递参数的内容。我需要什么样的 ruby​​ 变量才能返回我的值?

0 投票
8 回答
3403 浏览

c - 如何编写通用 C 函数来调用 Win32 函数?

为了允许从脚本语言(用 C 编写)访问 Win32 API,我想编写如下函数:

通常,它将调用任何 Win32 API 函数。

(LPSTR 参数本质上被用作字节数组 - 假设它们的大小已经正确,可以在函数外部采用正确的数据类型。另外我相信需要一些额外的复杂性来区分指针和非指针参数,但我出于这个问题的目的,我忽略了这一点)。

我遇到的问题是将参数传递给 Win32 API 函数。因为这些是标准调用,我不能使用可变参数,所以“调用”的实现必须提前知道参数的数量,因此它不能是通用的......

我想我可以用汇编代码来做到这一点(通过循环参数,将每个参数推入堆栈),但这在纯 C 中可能吗?

更新:我现在已将“不,不可能”的答案标记为已接受。如果基于 C 的解决方案出现,我当然会改变这一点。

更新: ruby/dl看起来可以使用合适的机制来实现。对此的任何细节将不胜感激。

0 投票
2 回答
172 浏览

c - 我熟悉 Ruby /DL,但不确定如何使用具有返回参数指针的 C 函数调用

我在这个模块中有这个功能

如何在模块中进行设置以访问指针?

里面有我需要的部分吗?我只是不确定。这是如何正确完成的?确切的代码在http://www.iausofa.org/2013_1202_C/sofa/cal2jd.c 我需要知道如何访问这些地址指针。验证测试在这里http://www.iasofa.org/2013_1202_C/sofa/t_sofa_c.c

一个几乎等效的 main C 看起来像下面的代码。我刚刚制作了 cal2jd.c 文件的副本,并将 main 函数添加到它的底部。

我用 > gcc -o cal2jd cal2jd.c 编译它

这是我的输出

状态良好,djm0 由头文件 sofam.h 中的常量设置为 2400000.5,您可以从源文件中的注释中看到它应该始终如此。您可以从验证测试文件中看到 djm 应该是什么。

我试图一次做太多事情。我在使用 SOFA 代码并尝试将其包装在 Ruby 中时正在学习一些 C 代码。(实际上是 JRuby)所以我会回答 C 部分、DL 或 FFI 或一些好的参考链接。

我也在考虑 ffi 方法。这是一个开始。

我真的在 JRuby 中尝试过这个。因为我迷路了,我该从哪里开始。请问我可以举一些好的例子吗?提前致谢。

0 投票
1 回答
100 浏览

ruby - 通过 Ruby/DL 调用 OpenProcessToken 时的段错误

请看下面的更新

我一直在尝试修复 Ruby 库跨 UAC 上下文与另一个程序通信的能力,并且需要创建一个与当前用户具有相同安全属性的共享文件映射。我正在使用 Ruby/dl 并试图让它在 Ruby 1.9.3 上工作是导致我的问题的原因。

在 advapi31 中调用OpenProcessToken函数会导致分段错误。您将在下面找到一个最小示例,它导致我的机器出现分段错误。我收到的错误文本在这里,这里也是错误文本打印到命令行后出现的错误框的屏幕截图:

Ruby 问题对话框

更新

将 Ruby 更新到 1.9.3p545(使用 RubyInstaller)允许我运行上面提供的示例,但我仍然遇到问题。我在这里创建了一个包含文件的要点,这些文件在使用 1.9.3p545 运行时会产生分段错误(尽管这次没有解释器变得无响应并产生上述对话框。)我已经在我的机器以及另一台安装相同版本 Ruby 的机器,结果相同。由于我之前没有提到它,我正在运行 Windows 7 Pro 64 位,我测试它的另一台计算机也是如此。

我注意到一些可能暗示更深层次的问题的事情,不一定与 OpenProcessToken 相关。以下任何一项都可以单独防止段错误:

  • 将 runner.rb 中的第 3 行复制到 mwe.rb 的底部并直接运行 mwe.rb。
  • 注释掉 mwe.rb 的第 5 行或注释掉一些较大的 errors.rb 子集(例如注释掉第 37 到 99 行不会导致段错误)。
  • 注释掉 runner.rb 的第 3 行,实际上只需要其他文件并退出。
  • 从 Pageant::Win 中注释掉以下组合不会导致段错误:
    • 来电extern
    • 来电struct
    • 常数
    • 类方法

在最后一种情况下,不需要注释掉特定类别的所有项目。例如,如果我注释掉TOKEN_USERSECURITY_ATTRIBUTES. 我还可以通过注释掉TOKEN_USERextern关联的语句来防止段错误IsValidSecurityDescriptor。我尝试了其他几种导致相同行为的组合。

任何帮助,将不胜感激。

0 投票
0 回答
41 浏览

ruby - 带有 DL::Importer 的未定义方法

调试器指出方法消息未定义是因为它嵌套在 C 中,如果是,我该如何更改

0 投票
1 回答
43 浏览

c - 没有声音。通过 RubyDL 使用 Ruby 和 winmm

预期行为:中间 C 在一个 midi 乐器上演奏,然后是另一个。实际行为:DL 弃用警告并且没有声音。运行 Windows 7。

编码:

摘自《实用 Ruby 项目》一书。根据第 2 章 11-15 页上的数字。代码稍作修改以处理 Ruby 1.9 中对 Ruby DL 的更改。