问题标签 [libffi]

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 投票
8 回答
3403 浏览

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

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

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

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

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

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

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

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

0 投票
6 回答
2800 浏览

ruby - Haskell 通过 FFI 与 Ruby 绑定?

由于 ruby​​ 和 Haskell 都支持 FFI,

  • 是否可以通过 FFI 从 ruby​​ 调用 Haskell 代码?
  • Ruby 中是否有任何 Haskell 绑定?
0 投票
1 回答
205 浏览

ruby - NULL in a RubyCocoa application?

I'm creating an application in RubyCocoa and I have this code:

It gives me this error:

I tried everything (including nil, OSX::NULL, OSX::nil, null(), NULL, etc).

Can anyone help me? Thanks.

0 投票
1 回答
4083 浏览

c - 自定义 X86_64 调用约定到 C 函数调用

我必须做一个接口(比如,一个包装器),它允许使用他的调用约定从 X86_64 汇编代码调用 C 函数,以及其他调用约定。最好的事情是非常“独立于编译器”(只是修改包装器),所以我正在寻找将寄存器/堆栈的东西放在编译器上的东西。我已经看过这里:P/Invoke 和 C# 的自定义调用约定,它与我要做的很接近。目前,我正在使用 GCC,但欢迎来自其他编译器的提示!

所以,这就是问题的最佳视图(自定义编码约定很奇怪):

我需要能够调用“特殊”(包装器)C 函数;这里的工作将是在其他 C 函数之间调度调用。所以这个包装器需要找到 %r11,保存所有寄存器并准备堆栈以供进一步调用。在 C 中是否有适当的方法来执行此操作(使用一些内联 asm)?

非常感谢

0 投票
1 回答
464 浏览

iphone - iPhone libffi 需要越狱吗?

我想为使用 libffi 的 iPhone OS 编写一个应用商店批准的应用程序。这是允许的吗?我能够用 NSInvocation 之类的东西重写所有使用它的部分,而不会有太多麻烦,但我更喜欢 libffi。所以我的问题是:使用 libffi 的应用程序会被应用商店拒绝吗?

0 投票
1 回答
982 浏览

python - 英特尔编译器和 Python/ctypes/libffi

我在使用英特尔编译器 (11.1) 构建具有 ctypes 的 Python 工作版本时遇到问题。问题是,ctypes 模块下的 libffi 在与 OpenGL 等接口时无法正常工作。

最初,libffi 没有使用未定义的英特尔编译器进行编译__int128_t,我遵循了已在几个地方列出的工作,即定义一个新类型:

typedef struct { int64_t m[2]; } __int128_t;

这遵循英特尔给出的响应:http: //software.intel.com/en-us/forums/showthread.php ?t=56652

补丁然后建议这样的事情:

应用补丁,东西编译,并ctypes可以导入,但是,当与 OpenGL 接口时,东西不起作用。运行 PyQt 的示例程序hellogl.py会导致空白视图。

有没有更好的工作方式来做到这一点?

担;

0 投票
1 回答
324 浏览

64-bit - Io 无法在 Mac OS X Snow Leopard 上编译

我按照自述文件中的说明进行操作,它们非常简单

问题出现在 make install 命令之后。Io 不会编译,特别是因为模块 CFFI。ld 抱怨我的 libffi.dylib 不是 64 位的,因此它不会链接 .o 文件,因此,它会抱怨这个或那个符号没有定义,等等。

我该如何解决这个问题?有没有办法通过将参数传递给 make、cmake 或编辑某些文件来编译 32 位的 Io?Makefile 有一个 CFFI 插件的条目。我可以删除它吗?我在哪里可以获得 64 位的 libcffi?这个库提供了一个 API 来访问高级语言的低级函数调用,所以我不太确定用 64 位替换我的 32 位,它可能会破坏我的 MacRuby 或其他东西。我希望能够使用 CFFI 和所有可能在我的系统中工作的插件来构建它,以便能够做更多的事情:我对 Objective-c 绑定感兴趣,我想这可能需要 cffi。

0 投票
4 回答
1746 浏览

gcc - 可以为 Cortex-M3 构建 Libffi 吗?

我正在尝试使用 GCC 为 Cortex-M3 处理器构建外部函数接口库。根据http://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html

-mthumb
为 Thumb 指令集生成代码。默认使用 32 位 ARM 指令集。此选项根据 -mcpu=name 和 -march=name 选项自动启用 16 位 Thumb-1 或混合 16/32 位 Thumb-2 指令。该选项不传递给汇编器。如果你想强制汇编器文件被解释为 Thumb 代码,要么在源代码中添加一个 `.thumb' 指令,要么将 -mthumb 选项通过前缀 -Wa 直接传递给汇编器。

我尝试将各种不同的参数传递给汇编程序,但似乎无法弄清楚。典型输出如下:

构建文件:../source/ffi/sysv.S
调用:GCC Assembler
arm-bare_newlib_cortex_m3_nommu-eabi-gcc -Wa,-mthumb-interwork -I"/home/neil/m3projects/robovero/firmware/include"-o" source/ffi/sysv.o" "../source/ffi/sysv.S"
../source/ffi/sysv.S:汇编器消息: ../source/ffi/sysv.S:
145:错误:已选择处理器不支持 ARM 操作码
../source/ffi/sysv.S:147:错误:尝试在 Thumb-only 处理器上使用 ARM 指令 -- `stmfd sp!,{r0-r3,fp,lr}'
...

我可以在 Cortex-M3 上使用 libffi 而不成为组装专家吗?

可能值得注意的是,当我直接调用 arm-bare_newlib_cortex_m3_nommu-eabi-as 时,我得到了不同的错误。

0 投票
1 回答
2316 浏览

c++ - 在 MinGW 上使用 libffi 调用 Windows API

我正在尝试为我的新编程语言提供 FFI 支持,该语言是使用 MinGW 工具链用 QT Creator 用 C++ 编写的。

为此,我使用了在这里找到的定制版本的 libffi:http: //ftp.gnome.org/pub/GNOME/binaries/win32/dependencies/libffi-dev_3.0.6-1_win32.zip

我还尝试了另一个版本:http ://pkgs.org/fedora-14/fedora-updates-i386/mingw32-libffi-3.0.9-1.fc14.noarch.rpm.html通过在 Linux 上下载 SRPM 文件,提取它,并将所需的文件复制到 Windows 分区。

无论如何,我包含所需的头文件,将导入库添加到项目中并将.dll放在应用程序的.exe旁边,它编译并运行,成功调用MessageBeep()。我接下来用 MessageBoxA() 尝试了它,但它一直在崩溃。调试器似乎没有提供太多有用的信息(编辑:除了确实发生了对 MessageBoxA 的调用之外)所以我一直在摆弄东西并重新运行无济于事。

为了将问题与我的语言细节隔离开来,我尝试通过填写自己的所有参数来手动调用 MessageBoxA,导致下面的代码仍然崩溃。

所以我的问题是:如何让下面的代码片段在 QT Creator/MinGW 下运行并实际显示一个消息框?

0 投票
2 回答
2019 浏览

firefox-addon - Javascript 字符串到 C++ 字符指针 -JSCTypes 中的 LPSTR 缓冲区

我正在使用 JSCTypes 从 JavaScript 访问 DLL。我必须通过将字符缓冲区传递给以下 API 来接收数据,

我的 jsctypes 看起来像这样,

使用上面的代码,我可以第一次正确接收数据,但 xulrunner 在随后的接收函数调用中崩溃。我尝试使用 Windows 上可用的通用 DLL 重现此问题。这会引发异常,未捕获的异常: TypeError: ctypes.char.array(500).address is not a function

如果我放弃地址 API 调用并尝试如下,

我遇到了这个问题,尽管在 C++ 中数组被视为指针。

'未捕获的异常:TypeError:预期的类型指针,在第 0 行第 0 列的文件 '' 中得到 ctypes.char.array(640000)'

我无权访问任何 dll 的源代码。我只有 DLL 的包含文件(.h)。我是一名 Java 开发人员,不确定是否可以在没有源代码的情况下进行调试。感谢任何帮助!