将指向一个 C 函数的指针作为参数传递给另一个函数
Passing a pointer to one C function as a parameter to another function
我正在使用 FFI gem so that I can access function in a C library directly from my Ruby 程序。如果 C 库有一个函数接受函数指针参数,并且它有第二个函数在该参数中具有正确的签名,那么我如何将指向第二个函数的指针作为参数传递给第一个函数?
我试过的
这是我到目前为止所尝试过的方法。为了简化事情,我在名为 bar.c
:
的文件中编写了我自己的非常简单的 C 库
#include <stdio.h>
typedef int bar_func();
int bar1()
{
return 7;
}
int bar2(bar_func * f)
{
printf("f=%p, bar2=%p\n", f, bar1);
return f() + f();
}
我在 Arch Linux 下由 运行ning gcc -std=gnu99 -fPIC -shared bar.c -o bar.so
编译了它
我的目标是将指向 bar1
的指针作为参数传递给 bar2
。我希望 bar2
打印两个相同的指针然后 return 14.
所以我 运行 这个程序使用 Ruby 2.2.0p0 和 ffi 1.9.6:
require 'ffi'
module Bar
extend ::FFI::Library
ffi_lib './bar.so'
callback :bar_func, [], :int
attach_function :bar1, [], :int
attach_function :bar2, [:bar_func], :int
puts bar2(method(:bar1)) # => 14
end
当我 运行 程序时,这是我得到的输出:
f=0x7f563ce46000, bar1=0x7f563af7d6e0
14
给出了正确的return值,但是可以看到传入bar2
函数的函数指针显然不等于bar1
,因为打印的两个函数指针第一行不同。
我在 FFI::Library documentation 中看到了提示。它说 attach_function
returns 一个 FFI::VariadicInvoker
对象。我做了一个有根据的猜测,你可以传递它而不是 proc,并且它起作用了。
module Bar
extend ::FFI::Library
ffi_lib './bar.so'
callback :bar_func, [], :int
Bar1Invoker = attach_function :bar1, [], :int
attach_function :bar2, [:bar_func], :int
puts bar2(Bar1Invoker) # => 14
end
我得到了想要的输出:
f=0x7f949ed7d6e0, bar1=0x7f949ed7d6e0
14
我已经编辑了 FFI wiki 上的 Callbacks 页面以获取此信息。
我正在使用 FFI gem so that I can access function in a C library directly from my Ruby 程序。如果 C 库有一个函数接受函数指针参数,并且它有第二个函数在该参数中具有正确的签名,那么我如何将指向第二个函数的指针作为参数传递给第一个函数?
我试过的
这是我到目前为止所尝试过的方法。为了简化事情,我在名为 bar.c
:
#include <stdio.h>
typedef int bar_func();
int bar1()
{
return 7;
}
int bar2(bar_func * f)
{
printf("f=%p, bar2=%p\n", f, bar1);
return f() + f();
}
我在 Arch Linux 下由 运行ning gcc -std=gnu99 -fPIC -shared bar.c -o bar.so
我的目标是将指向 bar1
的指针作为参数传递给 bar2
。我希望 bar2
打印两个相同的指针然后 return 14.
所以我 运行 这个程序使用 Ruby 2.2.0p0 和 ffi 1.9.6:
require 'ffi'
module Bar
extend ::FFI::Library
ffi_lib './bar.so'
callback :bar_func, [], :int
attach_function :bar1, [], :int
attach_function :bar2, [:bar_func], :int
puts bar2(method(:bar1)) # => 14
end
当我 运行 程序时,这是我得到的输出:
f=0x7f563ce46000, bar1=0x7f563af7d6e0
14
给出了正确的return值,但是可以看到传入bar2
函数的函数指针显然不等于bar1
,因为打印的两个函数指针第一行不同。
我在 FFI::Library documentation 中看到了提示。它说 attach_function
returns 一个 FFI::VariadicInvoker
对象。我做了一个有根据的猜测,你可以传递它而不是 proc,并且它起作用了。
module Bar
extend ::FFI::Library
ffi_lib './bar.so'
callback :bar_func, [], :int
Bar1Invoker = attach_function :bar1, [], :int
attach_function :bar2, [:bar_func], :int
puts bar2(Bar1Invoker) # => 14
end
我得到了想要的输出:
f=0x7f949ed7d6e0, bar1=0x7f949ed7d6e0
14
我已经编辑了 FFI wiki 上的 Callbacks 页面以获取此信息。